Handle double and long on the Managed side, and follow AAPCS on the Native side.
Change-Id: I43a8fa36cb79fb438f075986a46c66ab8258e725
diff --git a/src/assembler_arm.cc b/src/assembler_arm.cc
index a728239..70dd20c 100644
--- a/src/assembler_arm.cc
+++ b/src/assembler_arm.cc
@@ -1516,14 +1516,21 @@
void Assembler::Copy(FrameOffset dest, FrameOffset src, ManagedRegister scratch,
size_t size) {
CHECK(scratch.IsCoreRegister());
+ CHECK(size == 4 || size == 8);
if (size == 4) {
LoadFromOffset(kLoadWord, scratch.AsCoreRegister(),
SP, src.Int32Value());
StoreToOffset(kStoreWord, scratch.AsCoreRegister(),
SP, dest.Int32Value());
- } else {
- // TODO: size != 4
- LOG(FATAL) << "Unimplemented";
+ } else if (size == 8) {
+ LoadFromOffset(kLoadWord, scratch.AsCoreRegister(),
+ SP, src.Int32Value());
+ StoreToOffset(kStoreWord, scratch.AsCoreRegister(),
+ SP, dest.Int32Value());
+ LoadFromOffset(kLoadWord, scratch.AsCoreRegister(),
+ SP, src.Int32Value() + 4);
+ StoreToOffset(kStoreWord, scratch.AsCoreRegister(),
+ SP, dest.Int32Value() + 4);
}
}