Added support for 64-bit shifts, fix const-wide
Change-Id: I4823056d83652ecc7d3e391e905d480d73fab718
diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index fd1b8a7..483d7a7 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -897,7 +897,8 @@
case OP_CONST_WIDE:
rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true);
loadConstantValueWide(cUnit, rlResult.lowReg, rlResult.highReg,
- 0, mir->dalvikInsn.vB);
+ mir->dalvikInsn.vB_wide & 0xffffffff,
+ (mir->dalvikInsn.vB_wide >> 32) & 0xffffffff);
storeValueWide(cUnit, rlDest, rlResult);
break;
diff --git a/src/compiler/codegen/arm/Thumb2/Gen.cc b/src/compiler/codegen/arm/Thumb2/Gen.cc
index d8ecc84..4a2bdb3 100644
--- a/src/compiler/codegen/arm/Thumb2/Gen.cc
+++ b/src/compiler/codegen/arm/Thumb2/Gen.cc
@@ -1324,34 +1324,32 @@
RegLocation rlDest, RegLocation rlSrc1,
RegLocation rlShift)
{
- /*
- * Don't mess with the regsiters here as there is a particular calling
- * convention to the out-of-line handler.
- */
- RegLocation rlResult;
+ int funcOffset;
- loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
- loadValueDirect(cUnit, rlShift, r2);
switch( mir->dalvikInsn.opcode) {
case OP_SHL_LONG:
case OP_SHL_LONG_2ADDR:
- UNIMPLEMENTED(FATAL) << "Need SHL_LONG helper";
- //genDispatchToHandler(cUnit, TEMPLATE_SHL_LONG);
+ funcOffset = OFFSETOF_MEMBER(Thread, pShlLong);
break;
case OP_SHR_LONG:
case OP_SHR_LONG_2ADDR:
- UNIMPLEMENTED(FATAL) << "Need SHR_LONG helper";
- //genDispatchToHandler(cUnit, TEMPLATE_SHR_LONG);
+ funcOffset = OFFSETOF_MEMBER(Thread, pShrLong);
break;
case OP_USHR_LONG:
case OP_USHR_LONG_2ADDR:
- UNIMPLEMENTED(FATAL) << "Need USHR_LONG helper";
- //genDispatchToHandler(cUnit, TEMPLATE_USHR_LONG);
+ funcOffset = OFFSETOF_MEMBER(Thread, pUshrLong);
break;
default:
+ LOG(FATAL) << "Unexpected case";
return true;
}
- rlResult = oatGetReturnWide(cUnit);
+ oatFlushAllRegs(cUnit); /* Send everything to home location */
+ loadWordDisp(cUnit, rSELF, funcOffset, rLR);
+ loadValueDirectWideFixed(cUnit, rlSrc1, r0, r1);
+ loadValueDirect(cUnit, rlShift, r2);
+ opReg(cUnit, kOpBlx, rLR);
+ oatClobberCallRegs(cUnit);
+ RegLocation rlResult = oatGetReturnWide(cUnit);
storeValueWide(cUnit, rlDest, rlResult);
return false;
}