JIT: Fix for Issue 2881687 - fix volatiles and re-enable JIT
Change-Id: I2ccb4b46d92b729d5504ea9c1b771a5147096858
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 7a8f4ce..1bc6e95 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -48,6 +48,7 @@
$(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
$(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
$(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
+$(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/vm/Android.mk b/vm/Android.mk
index d499442..be71d3c 100644
--- a/vm/Android.mk
+++ b/vm/Android.mk
@@ -33,8 +33,6 @@
#
ifeq ($(TARGET_CPU_SMP),true)
- # Temporary workaround
- WITH_JIT := false
target_smp_flag := -DANDROID_SMP=1
else
target_smp_flag := -DANDROID_SMP=0
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c
index 0bcdd0e..cd0f18d 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.c
+++ b/vm/compiler/codegen/arm/CodegenDriver.c
@@ -1662,6 +1662,10 @@
branch2->generic.target = (LIR *)target;
break;
}
+ case OP_SGET_WIDE_VOLATILE:
+ case OP_SPUT_WIDE_VOLATILE:
+ genInterpSingleStep(cUnit, mir);
+ break;
default:
return true;
}
@@ -2142,23 +2146,48 @@
static bool handleFmt22c(CompilationUnit *cUnit, MIR *mir)
{
OpCode dalvikOpCode = mir->dalvikInsn.opCode;
- int fieldOffset;
+ int fieldOffset = -1;
bool isVolatile = false;
+ switch (dalvikOpCode) {
+ /*
+ * Wide volatiles currently handled via single step.
+ * Add them here if generating in-line code.
+ * case OP_IGET_WIDE_VOLATILE:
+ * case OP_IPUT_WIDE_VOLATILE:
+ */
+ case OP_IGET:
+ case OP_IGET_VOLATILE:
+ case OP_IGET_WIDE:
+ case OP_IGET_OBJECT:
+ case OP_IGET_OBJECT_VOLATILE:
+ case OP_IGET_BOOLEAN:
+ case OP_IGET_BYTE:
+ case OP_IGET_CHAR:
+ case OP_IGET_SHORT:
+ case OP_IPUT:
+ case OP_IPUT_VOLATILE:
+ case OP_IPUT_WIDE:
+ case OP_IPUT_OBJECT:
+ case OP_IPUT_OBJECT_VOLATILE:
+ case OP_IPUT_BOOLEAN:
+ case OP_IPUT_BYTE:
+ case OP_IPUT_CHAR:
+ case OP_IPUT_SHORT: {
+ Field *fieldPtr =
+ cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
- if (dalvikOpCode >= OP_IGET && dalvikOpCode <= OP_IPUT_SHORT) {
- Field *fieldPtr =
- cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
-
- if (fieldPtr == NULL) {
- LOGE("Unexpected null instance field");
- dvmAbort();
+ if (fieldPtr == NULL) {
+ LOGE("Unexpected null instance field");
+ dvmAbort();
+ }
+ isVolatile = dvmIsVolatileField(fieldPtr);
+ fieldOffset = ((InstField *)fieldPtr)->byteOffset;
+ break;
}
- isVolatile = dvmIsVolatileField(fieldPtr);
- fieldOffset = ((InstField *)fieldPtr)->byteOffset;
- } else {
- /* Deliberately break the code while make the compiler happy */
- fieldOffset = -1;
+ default:
+ break;
}
+
switch (dalvikOpCode) {
case OP_NEW_ARRAY: {
// Generates a call - use explicit registers
@@ -2280,6 +2309,7 @@
case OP_IPUT:
genIPut(cUnit, mir, kWord, fieldOffset, false, isVolatile);
break;
+ case OP_IPUT_VOLATILE:
case OP_IPUT_OBJECT_VOLATILE:
isVolatile = true;
// NOTE: intentional fallthrough
@@ -2298,8 +2328,6 @@
break;
case OP_IGET_WIDE_VOLATILE:
case OP_IPUT_WIDE_VOLATILE:
- case OP_SGET_WIDE_VOLATILE:
- case OP_SPUT_WIDE_VOLATILE:
genInterpSingleStep(cUnit, mir);
break;
default: