Fixes to make jni_compiler_test work on MIPS.
Fixed the jni compiler in numerous ways:
- Added NOP for delay slot of branches/jumps
- Made calling convention match registers pushed by stubs
- Fixes to assembly and added noreorder directive
Change-Id: I32bc55985fbbc58b5b5358149766b8738b3ac955
diff --git a/src/oat/utils/mips/assembler_mips.cc b/src/oat/utils/mips/assembler_mips.cc
index e164241..be1aceb 100644
--- a/src/oat/utils/mips/assembler_mips.cc
+++ b/src/oat/utils/mips/assembler_mips.cc
@@ -349,26 +349,32 @@
void MipsAssembler::Beq(Register rt, Register rs, uint16_t imm16) {
EmitI(0x4, rs, rt, imm16);
+ Nop();
}
void MipsAssembler::Bne(Register rt, Register rs, uint16_t imm16) {
EmitI(0x5, rs, rt, imm16);
+ Nop();
}
void MipsAssembler::J(uint32_t address) {
EmitJ(0x2, address);
+ Nop();
}
void MipsAssembler::Jal(uint32_t address) {
EmitJ(0x2, address);
+ Nop();
}
void MipsAssembler::Jr(Register rs) {
EmitR(0, rs, static_cast<Register>(0), static_cast<Register>(0), 0, 0x08);
+ Nop();
}
void MipsAssembler::Jalr(Register rs) {
- EmitR(0, rs, static_cast<Register>(0), static_cast<Register>(0), 0, 0x09);
+ EmitR(0, rs, static_cast<Register>(0), RA, 0, 0x09);
+ Nop();
}
void MipsAssembler::AddS(FRegister fd, FRegister fs, FRegister ft) {
@@ -445,6 +451,10 @@
static_cast<Register>(0), 0, 0xD);
}
+void MipsAssembler::Nop() {
+ EmitR(0x0, static_cast<Register>(0), static_cast<Register>(0), static_cast<Register>(0), 0, 0x0);
+}
+
void MipsAssembler::Move(Register rt, Register rs) {
EmitI(0x8, rs, rt, 0);
}
@@ -604,6 +614,9 @@
// Decrease frame to required size.
DecreaseFrameSize(frame_size);
+
+ // Then jump to the return address.
+ Jr(RA);
}
void MipsAssembler::IncreaseFrameSize(size_t adjust) {