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/runtime/mips/stub_mips.cc b/src/oat/runtime/mips/stub_mips.cc
index 8ab3f8d..4865c59 100644
--- a/src/oat/runtime/mips/stub_mips.cc
+++ b/src/oat/runtime/mips/stub_mips.cc
@@ -131,36 +131,20 @@
UniquePtr<MipsAssembler> assembler(static_cast<MipsAssembler*>(Assembler::Create(kMips)));
#if !defined(ART_USE_LLVM_COMPILER)
// Save callee saves and ready frame for exception delivery
- __ AddConstant(SP, SP, -176);
- __ StoreToOffset(kStoreWord, RA, SP, 172);
- __ StoreToOffset(kStoreWord, T9, SP, 168);
- __ StoreToOffset(kStoreWord, T8, SP, 164);
- __ StoreToOffset(kStoreWord, T7, SP, 160);
- __ StoreToOffset(kStoreWord, T6, SP, 156);
- __ StoreToOffset(kStoreWord, T5, SP, 152);
- __ StoreToOffset(kStoreWord, T4, SP, 148);
- __ StoreToOffset(kStoreWord, T3, SP, 144);
- __ StoreToOffset(kStoreWord, T2, SP, 140);
- __ StoreToOffset(kStoreWord, T1, SP, 136);
- __ StoreToOffset(kStoreWord, T0, SP, 132);
- __ StoreDToOffset(D15, SP, 124);
- __ StoreDToOffset(D14, SP, 116);
- __ StoreDToOffset(D13, SP, 108);
- __ StoreDToOffset(D12, SP, 100);
- __ StoreDToOffset(D11, SP, 92);
- __ StoreDToOffset(D10, SP, 84);
- __ StoreDToOffset(D9, SP, 76);
- __ StoreDToOffset(D8, SP, 68);
- __ StoreDToOffset(D7, SP, 60);
- __ StoreDToOffset(D6, SP, 52);
- __ StoreDToOffset(D5, SP, 44);
- __ StoreDToOffset(D4, SP, 36);
- __ StoreDToOffset(D3, SP, 28);
- __ StoreDToOffset(D2, SP, 20);
- __ StoreDToOffset(D1, SP, 12);
- __ StoreDToOffset(D0, SP, 4);
+ __ AddConstant(SP, SP, -48);
+ __ StoreToOffset(kStoreWord, RA, SP, 44);
+ __ StoreToOffset(kStoreWord, T9, SP, 40);
+ __ StoreToOffset(kStoreWord, T8, SP, 36);
+ __ StoreToOffset(kStoreWord, T7, SP, 32);
+ __ StoreToOffset(kStoreWord, T6, SP, 28);
+ __ StoreToOffset(kStoreWord, T5, SP, 24);
+ __ StoreToOffset(kStoreWord, T4, SP, 20);
+ __ StoreToOffset(kStoreWord, T3, SP, 16);
+ __ StoreToOffset(kStoreWord, T2, SP, 12);
+ __ StoreToOffset(kStoreWord, T1, SP, 8);
+ __ StoreToOffset(kStoreWord, T0, SP, 4);
- // R0 is the Method* already
+ // A0 is the Method* already
__ Move(A1, S1); // Pass Thread::Current() in A1
__ Move(A2, SP); // Pass SP in A2
// Call to throw AbstractMethodError