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: