am 840d233c: am 800e4320: am 63c34b5e: am 68719a17: (-s ours) Reconcile with jb-mr1-release - do not merge

* commit '840d233c12200de9260c85d6eadbc73b41cef00b':
diff --git a/Android.mk b/Android.mk
index 73ec342..adde173 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,7 +22,6 @@
 		dexlist \
 		dexopt \
 		dexdump \
-		dvz \
 		dx \
 		tools \
 		unit-tests \
diff --git a/dexdump/DexDump.cpp b/dexdump/DexDump.cpp
index 6ecf671..0d7b425 100644
--- a/dexdump/DexDump.cpp
+++ b/dexdump/DexDump.cpp
@@ -787,6 +787,7 @@
                 outSize = snprintf(buf, bufSize, "%s.%s:%s // method@%0*x",
                         methInfo.classDescriptor, methInfo.name,
                         methInfo.signature, width, index);
+                free((void *) methInfo.signature);
             } else {
                 outSize = snprintf(buf, bufSize, "<method?> // method@%0*x",
                         width, index);
@@ -1069,6 +1070,7 @@
     printf("%06x:                                        |[%06x] %s.%s:%s\n",
         startAddr, startAddr,
         className, methInfo.name, methInfo.signature);
+    free((void *) methInfo.signature);
 
     insnIdx = 0;
     while (insnIdx < (int) pCode->insnsSize) {
diff --git a/dvz/Android.mk b/dvz/Android.mk
deleted file mode 100644
index 22d0950..0000000
--- a/dvz/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2006 The Android Open Source Project
-
-LOCAL_PATH := $(my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
-	dvz.cpp
-
-LOCAL_SHARED_LIBRARIES := \
-	libcutils
-
-LOCAL_C_INCLUDES :=
-
-LOCAL_CFLAGS :=
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := dvz
-
-include $(BUILD_EXECUTABLE)
diff --git a/dvz/dvz.cpp b/dvz/dvz.cpp
deleted file mode 100644
index 88fe086..0000000
--- a/dvz/dvz.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cutils/zygote.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-
-#ifndef NELEM
-# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
-#endif
-
-// pid of child process
-static pid_t g_pid = -1;
-
-static void signal_forwarder (int signal, siginfo_t *si, void *context)
-{
-    if (g_pid >= 0) {
-        kill(g_pid, signal);
-    }
-}
-
-static void post_run_func (int pid) {
-    int my_pgid;
-    int spawned_pgid;
-    int i;
-    int err;
-
-    g_pid = pid;
-
-    my_pgid = getpgid(0);
-    if (my_pgid < 0) {
-        perror ("error with getpgid()");
-        exit (-1);
-    }
-
-    spawned_pgid = getpgid(pid);
-    if (spawned_pgid < 0) {
-        perror ("error with getpgid()");
-        exit (-1);
-    }
-
-    if (my_pgid != spawned_pgid) {
-        // The zygote was unable to move this process into our pgid
-        // We have to forward signals
-
-        int forward_signals[]
-            = {SIGHUP, SIGINT, SIGTERM, SIGWINCH,
-            SIGTSTP, SIGTTIN, SIGTTOU, SIGCONT};
-
-        struct sigaction sa;
-        memset(&sa, 0, sizeof(sa));
-
-        sa.sa_sigaction = signal_forwarder;
-        sa.sa_flags = SA_SIGINFO;
-
-        for (i = 0; i < NELEM(forward_signals); i++) {
-            err = sigaction(forward_signals[i], &sa, NULL);
-            if (err < 0) {
-                perror ("unexpected error");
-                exit (-1);
-            }
-        }
-    }
-}
-
-static void usage(const char *argv0) {
-    fprintf(stderr,"Usage: %s [--help] [-classpath <classpath>] \n"
-    "\t[additional zygote args] fully.qualified.java.ClassName [args]\n", argv0);
-    fprintf(stderr, "\nRequests a new Dalvik VM instance to be spawned from the zygote\n"
-    "process. stdin, stdout, and stderr are hooked up. This process remains\n"
-    "while the spawned VM instance is alive and forwards some signals.\n"
-    "The exit code of the spawned VM instance is dropped.\n");
-}
-
-int main (int argc, const char **argv) {
-    int err;
-
-    if (argc > 1 && 0 == strcmp(argv[1], "--help")) {
-        usage(argv[0]);
-        exit(0);
-    }
-
-    err = zygote_run_wait(argc - 1, argv + 1, post_run_func);
-
-    if (err < 0) {
-        fprintf(stderr, "%s error: no zygote process found\n", argv[0]);
-        exit(-1);
-    }
-    exit(0);
-}
diff --git a/libdex/SysUtil.cpp b/libdex/SysUtil.cpp
index 456d26e..ba82de2 100644
--- a/libdex/SysUtil.cpp
+++ b/libdex/SysUtil.cpp
@@ -106,46 +106,6 @@
     return 0;
 }
 
-/*
- * Pull the contents of a file into an new shared memory segment.  We grab
- * everything from fd's current offset on.
- *
- * We need to know the length ahead of time so we can allocate a segment
- * of sufficient size.
- */
-int sysLoadFileInShmem(int fd, MemMapping* pMap)
-{
-#ifdef HAVE_POSIX_FILEMAP
-    off_t start;
-    size_t length, actual;
-    void* memPtr;
-
-    assert(pMap != NULL);
-
-    if (getFileStartAndLength(fd, &start, &length) < 0)
-        return -1;
-
-    memPtr = sysCreateAnonShmem(length);
-    if (memPtr == NULL)
-        return -1;
-
-    actual = read(fd, memPtr, length);
-    if (actual != length) {
-        ALOGE("only read %d of %d bytes", (int) actual, (int) length);
-        sysReleaseShmem(pMap);
-        return -1;
-    }
-
-    pMap->baseAddr = pMap->addr = memPtr;
-    pMap->baseLength = pMap->length = length;
-
-    return 0;
-#else
-    ALOGE("sysLoadFileInShmem not implemented.");
-    return -1;
-#endif
-}
-
 #ifndef HAVE_POSIX_FILEMAP
 int sysFakeMapFile(int fd, MemMapping* pMap)
 {
@@ -177,41 +137,6 @@
 #endif
 
 /*
- * Map a file (from fd's current offset) into a shared, read-only memory
- * segment.  The file offset must be a multiple of the system page size.
- *
- * On success, returns 0 and fills out "pMap".  On failure, returns a nonzero
- * value and does not disturb "pMap".
- */
-int sysMapFileInShmemReadOnly(int fd, MemMapping* pMap)
-{
-#ifdef HAVE_POSIX_FILEMAP
-    off_t start;
-    size_t length;
-    void* memPtr;
-
-    assert(pMap != NULL);
-
-    if (getFileStartAndLength(fd, &start, &length) < 0)
-        return -1;
-
-    memPtr = mmap(NULL, length, PROT_READ, MAP_FILE | MAP_SHARED, fd, start);
-    if (memPtr == MAP_FAILED) {
-        ALOGW("mmap(%d, RO, FILE|SHARED, %d, %d) failed: %s", (int) length,
-            fd, (int) start, strerror(errno));
-        return -1;
-    }
-
-    pMap->baseAddr = pMap->addr = memPtr;
-    pMap->baseLength = pMap->length = length;
-
-    return 0;
-#else
-    return sysFakeMapFile(fd, pMap);
-#endif
-}
-
-/*
  * Map a file (from fd's current offset) into a private, read-write memory
  * segment that will be marked read-only (a/k/a "writable read-only").  The
  * file offset must be a multiple of the system page size.
diff --git a/libdex/SysUtil.h b/libdex/SysUtil.h
index 90a63ca..c02ec6e 100644
--- a/libdex/SysUtil.h
+++ b/libdex/SysUtil.h
@@ -54,25 +54,6 @@
 void sysCopyMap(MemMapping* dst, const MemMapping* src);
 
 /*
- * Load a file into a new shared memory segment.  All data from the current
- * offset to the end of the file is pulled in.
- *
- * The segment is read-write, allowing VM fixups.  (It should be modified
- * to support .gz/.zip compressed data.)
- *
- * On success, "pMap" is filled in, and zero is returned.
- */
-int sysLoadFileInShmem(int fd, MemMapping* pMap);
-
-/*
- * Map a file (from fd's current offset) into a shared,
- * read-only memory segment.
- *
- * On success, "pMap" is filled in, and zero is returned.
- */
-int sysMapFileInShmemReadOnly(int fd, MemMapping* pMap);
-
-/*
  * Map a file (from fd's current offset) into a shared, read-only memory
  * segment that can be made writable.  (In some cases, such as when
  * mapping a file on a FAT filesystem, the result may be fully writable.)
@@ -82,7 +63,9 @@
 int sysMapFileInShmemWritableReadOnly(int fd, MemMapping* pMap);
 
 /*
- * Like sysMapFileInShmemReadOnly, but on only part of a file.
+ * Map part of a file into a shared, read-only memory segment.
+ *
+ * On success, "pMap" is filled in, and zero is returned.
  */
 int sysMapFileSegmentInShmem(int fd, off_t start, size_t length,
     MemMapping* pMap);
diff --git a/tests/004-annotations/build b/tests/004-annotations/build
new file mode 100644
index 0000000..c147cb2
--- /dev/null
+++ b/tests/004-annotations/build
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Stop if something fails.
+set -e
+
+mkdir classes
+
+# android.test.anno.MissingAnnotation is available at compile time...
+${JAVAC} -d classes `find src -name '*.java'`
+
+# ...but not at run time.
+rm classes/android/test/anno/MissingAnnotation.class
+dx -JXmx256m --debug --dex --output=test.jar classes
diff --git a/tests/004-annotations/expected.txt b/tests/004-annotations/expected.txt
index 8f19c4c..dc13a98 100644
--- a/tests/004-annotations/expected.txt
+++ b/tests/004-annotations/expected.txt
@@ -94,3 +94,10 @@
 
 SimplyNoted.get(AnnoSimpleType) = @android.test.anno.AnnoSimpleType()
 SubNoted.get(AnnoSimpleType) = @android.test.anno.AnnoSimpleType()
+
+Package annotations:
+      @android.test.anno.AnnoSimplePackage()
+        interface android.test.anno.AnnoSimplePackage
+Package declared annotations:
+      @android.test.anno.AnnoSimplePackage()
+        interface android.test.anno.AnnoSimplePackage
diff --git a/tests/004-annotations/src/android/test/AnnoSimplePackage1.java b/tests/004-annotations/src/android/test/AnnoSimplePackage1.java
new file mode 100644
index 0000000..629cb7d
--- /dev/null
+++ b/tests/004-annotations/src/android/test/AnnoSimplePackage1.java
@@ -0,0 +1,8 @@
+package android.test;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.PACKAGE)
+@Retention(RetentionPolicy.RUNTIME)
+
+public @interface AnnoSimplePackage1 {}
diff --git a/tests/004-annotations/src/android/test/anno/MissingAnnotation.java b/tests/004-annotations/src/android/test/anno/MissingAnnotation.java
new file mode 100644
index 0000000..56da15a
--- /dev/null
+++ b/tests/004-annotations/src/android/test/anno/MissingAnnotation.java
@@ -0,0 +1,8 @@
+package android.test.anno;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Retention(RUNTIME) public @interface MissingAnnotation {
+}
+
diff --git a/tests/004-annotations/src/android/test/anno/SimplyNoted.java b/tests/004-annotations/src/android/test/anno/SimplyNoted.java
index 95a3d24..b757465 100644
--- a/tests/004-annotations/src/android/test/anno/SimplyNoted.java
+++ b/tests/004-annotations/src/android/test/anno/SimplyNoted.java
@@ -3,24 +3,30 @@
 @AnnoSimpleType
 @AnnoSimpleType2
 @AnnoSimpleTypeInvis
+@MissingAnnotation
 public class SimplyNoted {
     @AnnoSimpleField
+    @MissingAnnotation
     public int mFoo;
 
     @AnnoSimpleField
+    @MissingAnnotation
     public static int mOneFoo;
 
     @AnnoSimpleConstructor
+    @MissingAnnotation
     SimplyNoted() {
         mFoo = 0;
     }
 
     @AnnoSimpleConstructor
+    @MissingAnnotation
     SimplyNoted(@AnnoSimpleParameter int xyzzy) {
         mFoo = xyzzy;
     }
 
     @AnnoSimpleMethod
+    @MissingAnnotation
     public int foo() {
         @AnnoSimpleLocalVariable
         int bar = 5;
diff --git a/tests/004-annotations/src/android/test/anno/TestAnnotations.java b/tests/004-annotations/src/android/test/anno/TestAnnotations.java
index 4ad32d5..4eabb12 100644
--- a/tests/004-annotations/src/android/test/anno/TestAnnotations.java
+++ b/tests/004-annotations/src/android/test/anno/TestAnnotations.java
@@ -173,5 +173,14 @@
         // this is non-null if the @Inherited tag is present
         anno = SubNoted.class.getAnnotation(AnnoSimpleType.class);
         System.out.println("SubNoted.get(AnnoSimpleType) = " + anno);
+
+        System.out.println();
+
+        // Package annotations aren't inherited, so getAnnotations and getDeclaredAnnotations are
+        // the same.
+        System.out.println("Package annotations:");
+        printAnnotationArray("    ", TestAnnotations.class.getPackage().getAnnotations());
+        System.out.println("Package declared annotations:");
+        printAnnotationArray("    ", TestAnnotations.class.getPackage().getDeclaredAnnotations());
     }
 }
diff --git a/tests/004-annotations/src/android/test/package-info.java b/tests/004-annotations/src/android/test/package-info.java
new file mode 100644
index 0000000..e188cda
--- /dev/null
+++ b/tests/004-annotations/src/android/test/package-info.java
@@ -0,0 +1,2 @@
+@AnnoSimplePackage1
+package android.test;
diff --git a/tests/084-class-init/expected.txt b/tests/084-class-init/expected.txt
index 6e74fbb..68a2b38 100644
--- a/tests/084-class-init/expected.txt
+++ b/tests/084-class-init/expected.txt
@@ -1,6 +1,7 @@
 Got expected EIIE for FIELD0
 Got expected NCDFE for FIELD0
 Got expected NCDFE for FIELD1
+Got expected 'hello!' from Exploder
 SlowInit static block pre-sleep
 SlowInit static block post-sleep
 MethodThread message
diff --git a/tests/084-class-init/src/Exploder.java b/tests/084-class-init/src/Exploder.java
new file mode 100644
index 0000000..911e5fe
--- /dev/null
+++ b/tests/084-class-init/src/Exploder.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/**
+ * Throws an Error rather than an exception from its class initializer.
+ */
+public class Exploder {
+    public static final Object FIELD = new AssertThrower();
+    static class AssertThrower {
+        AssertThrower() {
+            throw new AssertionError("hello!");
+        }
+    }
+}
diff --git a/tests/084-class-init/src/Main.java b/tests/084-class-init/src/Main.java
index de28ed9..29681ce 100644
--- a/tests/084-class-init/src/Main.java
+++ b/tests/084-class-init/src/Main.java
@@ -48,6 +48,13 @@
         } catch (NoClassDefFoundError ncdfe) {
             System.out.println("Got expected NCDFE for FIELD1");
         }
+
+        try {
+            System.out.println(Exploder.FIELD);
+            System.err.println("Load of FIELD succeeded unexpectedly");
+        } catch (AssertionError expected) {
+            System.out.println("Got expected '" + expected.getMessage() + "' from Exploder");
+        }
     }
 
     static void checkTiming() {
diff --git a/tests/301-abstract-protected/expected.txt b/tests/301-abstract-protected/expected.txt
new file mode 100644
index 0000000..b0aad4d
--- /dev/null
+++ b/tests/301-abstract-protected/expected.txt
@@ -0,0 +1 @@
+passed
diff --git a/tests/301-abstract-protected/info.txt b/tests/301-abstract-protected/info.txt
new file mode 100644
index 0000000..0751eff
--- /dev/null
+++ b/tests/301-abstract-protected/info.txt
@@ -0,0 +1,3 @@
+Tests a dalvik bug where we'd treat an abstract method as an implementation
+of an interface method; the RI only cares about the visibility of the actual
+implementation in non-abstract subclasses.
diff --git a/tests/301-abstract-protected/src/Main.java b/tests/301-abstract-protected/src/Main.java
new file mode 100644
index 0000000..9b19a9d
--- /dev/null
+++ b/tests/301-abstract-protected/src/Main.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class Main {
+  public static void main(String args[]) throws Exception {
+    System.err.println(new C().m());
+  }
+}
+
+// An arbitrary interface.
+interface I { public String m(); }
+
+// This is I-like, but doesn't actually claim to implement I.
+abstract class Abstract { protected abstract String m(); }
+
+// This claims to implement I, but the inherited m isn't sufficiently visible.
+abstract class AbstractI extends Abstract implements I { }
+
+// This has a concrete m that's sufficiently visible, so all should be good.
+class C extends AbstractI { public String m() { return "passed"; }; }
diff --git a/tests/etc/push-and-run-test-jar b/tests/etc/push-and-run-test-jar
index b64f6a6..2028217 100755
--- a/tests/etc/push-and-run-test-jar
+++ b/tests/etc/push-and-run-test-jar
@@ -9,7 +9,6 @@
 #   --jit         -- use the jit
 #   --portable    -- use the portable interpreter
 #   --debug       -- wait for debugger to attach
-#   --zygote      -- use the zygote (if so, all other options are ignored)
 #   --dev         -- development mode (print the vm invocation cmdline)
 #   --no-verify   -- turn off verification (on by default)
 #   --no-optimize -- turn off optimization (on by default)
@@ -25,7 +24,6 @@
 DEBUG="n"
 VERIFY="y"
 OPTIMIZE="y"
-ZYGOTE="n"
 QUIET="n"
 PRECISE="y"
 DEV_MODE="n"
@@ -49,10 +47,6 @@
     elif [ "x$1" = "x--debug" ]; then
         DEBUG="y"
         shift
-    elif [ "x$1" = "x--zygote" ]; then
-        ZYGOTE="y"
-        msg "Spawning from zygote"
-        shift
     elif [ "x$1" = "x--dev" ]; then
         DEV_MODE="y"
         shift
@@ -76,31 +70,29 @@
     fi
 done
 
-if [ "$ZYGOTE" = "n" ]; then
-    if [ "x$INTERP" = "x" ]; then
-        INTERP="jit"
-        msg "Using jit by default"
-    fi
+if [ "x$INTERP" = "x" ]; then
+    INTERP="jit"
+    msg "Using jit by default"
+fi
 
-    if [ "$OPTIMIZE" = "y" ]; then
-        if [ "$VERIFY" = "y" ]; then
-            DEX_OPTIMIZE="-Xdexopt:verified"
-        else
-            DEX_OPTIMIZE="-Xdexopt:all"
-        fi
-        msg "Performing optimizations"
-    else
-        DEX_OPTIMIZE="-Xdexopt:none"
-        msg "Skipping optimizations"
-    fi
-
+if [ "$OPTIMIZE" = "y" ]; then
     if [ "$VERIFY" = "y" ]; then
-        DEX_VERIFY=""
-        msg "Performing verification"
+        DEX_OPTIMIZE="-Xdexopt:verified"
     else
-        DEX_VERIFY="-Xverify:none"
-        msg "Skipping verification"
+        DEX_OPTIMIZE="-Xdexopt:all"
     fi
+    msg "Performing optimizations"
+else
+    DEX_OPTIMIZE="-Xdexopt:none"
+    msg "Skipping optimizations"
+fi
+
+if [ "$VERIFY" = "y" ]; then
+    DEX_VERIFY=""
+    msg "Performing verification"
+else
+    DEX_VERIFY="-Xverify:none"
+    msg "Skipping verification"
 fi
 
 msg "------------------------------"
@@ -123,13 +115,9 @@
     GC_OPTS="-Xgc:noprecise"
 fi
 
-if [ "$ZYGOTE" = "y" ]; then
-    adb shell cd /data \; dvz -classpath test.jar Main "$@"
-else
-    cmdline="cd /data; dalvikvm $DEX_VERIFY $DEX_OPTIMIZE $DEX_DEBUG \
-        $GC_OPTS -cp test.jar -Xint:${INTERP} -ea Main"
-    if [ "$DEV_MODE" = "y" ]; then
-        echo $cmdline "$@"
-    fi
-    adb shell $cmdline "$@"
+cmdline="cd /data; dalvikvm $DEX_VERIFY $DEX_OPTIMIZE $DEX_DEBUG \
+    $GC_OPTS -cp test.jar -Xint:${INTERP} -ea Main"
+if [ "$DEV_MODE" = "y" ]; then
+    echo $cmdline "$@"
 fi
+adb shell $cmdline "$@"
diff --git a/tests/run-test b/tests/run-test
index 406e424..6c8c457 100755
--- a/tests/run-test
+++ b/tests/run-test
@@ -34,7 +34,7 @@
 prog="${progdir}"/`basename "${prog}"`
 
 export JAVA="java"
-export JAVAC="javac -target 1.5"
+export JAVAC="javac -source 1.5 -target 1.5"
 export RUN="${progdir}/etc/push-and-run-test-jar"
 
 info="info.txt"
diff --git a/tools/dmtracedump/TraceDump.c b/tools/dmtracedump/TraceDump.c
index 976fe5f..0dfeed3 100644
--- a/tools/dmtracedump/TraceDump.c
+++ b/tools/dmtracedump/TraceDump.c
@@ -2879,7 +2879,7 @@
     DataKeys* dataKeys = parseDataKeys(&data1, gOptions.traceFileName,
                                        &sumThreadTime);
     if (dataKeys == NULL) {
-        fprintf(stderr, "Cannot read trace.\n");
+        fprintf(stderr, "Cannot read \"%s\".\n", gOptions.traceFileName);
         exit(1);
     }
 
@@ -2887,6 +2887,10 @@
         uint64_t sum2;
         TraceData data2;
         DataKeys* d2 = parseDataKeys(&data2, gOptions.diffFileName, &sum2);
+        if (d2 == NULL) {
+            fprintf(stderr, "Cannot read \"%s\".\n", gOptions.diffFileName);
+            exit(1);
+        }
 
         createDiff(d2, sum2, dataKeys, sumThreadTime);
 
diff --git a/vm/Android.mk b/vm/Android.mk
index 64e4aaf..0af62e8 100644
--- a/vm/Android.mk
+++ b/vm/Android.mk
@@ -40,10 +40,10 @@
 host_smp_flag := -DANDROID_SMP=1
 
 # Build the installed version (libdvm.so) first
+WITH_JIT := true
 include $(LOCAL_PATH)/ReconfigureDvm.mk
 
 # Overwrite default settings
-LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := libdvm
 LOCAL_CFLAGS += $(target_smp_flag)
 
@@ -55,48 +55,43 @@
     LOCAL_CFLAGS := $(filter-out $(CLANG_CONFIG_UNKNOWN_CFLAGS),$(LOCAL_CFLAGS))
 endif
 
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+
 include $(BUILD_SHARED_LIBRARY)
 
-# If WITH_JIT is configured, build multiple versions of libdvm.so to facilitate
-# correctness/performance bugs triage
-ifeq ($(WITH_JIT),true)
+# Derivation #1
+# Enable assertions and JIT tuning
+include $(LOCAL_PATH)/ReconfigureDvm.mk
+LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
+                -DWITH_JIT_TUNING $(target_smp_flag)
+LOCAL_MODULE := libdvm_assert
+include $(BUILD_SHARED_LIBRARY)
 
-    # Derivation #1
-    # Enable assert and JIT tuning
-    include $(LOCAL_PATH)/ReconfigureDvm.mk
+ifneq ($(dvm_arch),mips)    # MIPS support for self-verification is incomplete
 
-    # Enable assertions and JIT-tuning
-    LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
-                    -DWITH_JIT_TUNING $(target_smp_flag)
-    LOCAL_MODULE := libdvm_assert
-    include $(BUILD_SHARED_LIBRARY)
-
-  ifneq ($(dvm_arch),mips)    # MIPS support for self-verification is incomplete
     # Derivation #2
-    # Enable assert and self-verification
-    include $(LOCAL_PATH)/ReconfigureDvm.mk
-
     # Enable assertions and JIT self-verification
+    include $(LOCAL_PATH)/ReconfigureDvm.mk
     LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
                     -DWITH_SELF_VERIFICATION $(target_smp_flag)
+    # TODO: split out the asflags.
+    LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
     LOCAL_MODULE := libdvm_sv
     include $(BUILD_SHARED_LIBRARY)
-  endif # dvm_arch!=mips
 
-    # Derivation #3
-    # Compile out the JIT
-    WITH_JIT := false
-    include $(LOCAL_PATH)/ReconfigureDvm.mk
+endif # dvm_arch!=mips
 
-    LOCAL_CFLAGS += $(target_smp_flag)
-    LOCAL_MODULE := libdvm_interp
-    include $(BUILD_SHARED_LIBRARY)
+# Derivation #3
+# Compile out the JIT
+WITH_JIT := false
+include $(LOCAL_PATH)/ReconfigureDvm.mk
+LOCAL_CFLAGS += $(target_smp_flag)
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+LOCAL_MODULE := libdvm_interp
+include $(BUILD_SHARED_LIBRARY)
 
-  ifeq ($(dvm_arch),x86)    # For x86, we enable JIT on host too
-    # restore WITH_JIT = true for host dalvik build
-    WITH_JIT := true
-  endif # dvm_arch==x86
-endif
 
 #
 # Build for the host.
@@ -111,12 +106,7 @@
     dvm_arch := $(HOST_ARCH)
     # Note: HOST_ARCH_VARIANT isn't defined.
     dvm_arch_variant := $(HOST_ARCH)
-
-    # We always want the x86 JIT.
-    ifeq ($(dvm_arch),x86)
-        WITH_JIT := true
-    endif
-
+    WITH_JIT := true
     include $(LOCAL_PATH)/Dvm.mk
 
     LOCAL_SHARED_LIBRARIES += libcrypto libssl libicuuc libicui18n
@@ -143,6 +133,8 @@
     endif
 
     LOCAL_CFLAGS += $(host_smp_flag)
+    # TODO: split out the asflags.
+    LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
     LOCAL_MODULE_TAGS := optional
     LOCAL_MODULE := libdvm
 
diff --git a/vm/Atomic.cpp b/vm/Atomic.cpp
index bd2255b..ccbf64a 100644
--- a/vm/Atomic.cpp
+++ b/vm/Atomic.cpp
@@ -42,9 +42,6 @@
 #define NEED_PTHREADS_QUASI_ATOMICS 1
 #endif
 
-#elif defined(__sh__)
-#define NEED_PTHREADS_QUASI_ATOMICS 1
-
 #else
 #error "Unsupported atomic operations for this platform"
 #endif
diff --git a/vm/AtomicCache.cpp b/vm/AtomicCache.cpp
index a8c82e6..6fbbc12 100644
--- a/vm/AtomicCache.cpp
+++ b/vm/AtomicCache.cpp
@@ -49,8 +49,10 @@
 
     newCache->entryAlloc = calloc(1,
         sizeof(AtomicCacheEntry) * numEntries + CPU_CACHE_WIDTH);
-    if (newCache->entryAlloc == NULL)
+    if (newCache->entryAlloc == NULL) {
+        free(newCache);
         return NULL;
+    }
 
     /*
      * Adjust storage to align on a 32-byte boundary.  Each entry is 16 bytes
diff --git a/vm/AtomicCache.h b/vm/AtomicCache.h
index 00a0900..42ba6be 100644
--- a/vm/AtomicCache.h
+++ b/vm/AtomicCache.h
@@ -136,8 +136,10 @@
          * boost.                                                           \
          */                                                                 \
         value = (u4) ATOMIC_CACHE_CALC;                                     \
-        dvmUpdateAtomicCache((u4) (_key1), (u4) (_key2), value, pEntry,     \
-                    firstVersion CACHE_XARG(_cache) );                      \
+        if (value == 0 && ATOMIC_CACHE_NULL_ALLOWED) { \
+            dvmUpdateAtomicCache((u4) (_key1), (u4) (_key2), value, pEntry, \
+                        firstVersion CACHE_XARG(_cache) ); \
+        } \
     }                                                                       \
     value;                                                                  \
 })
diff --git a/vm/CheckJni.cpp b/vm/CheckJni.cpp
index ccb5836..68d6680 100644
--- a/vm/CheckJni.cpp
+++ b/vm/CheckJni.cpp
@@ -497,6 +497,7 @@
      * m - jmethodID
      * p - void*
      * r - jint (for release mode arguments)
+     * t - thread args (for AttachCurrentThread)
      * u - const char* (modified UTF-8)
      * z - jsize (for lengths; use i if negative values are okay)
      * v - JavaVM*
@@ -611,7 +612,7 @@
                     if (!entry) {
                         StringAppendF(&msg, " (%p)", mid);
                     }
-                } else if (ch == 'p') { // void* ("pointer")
+                } else if (ch == 'p' || ch == 't') { // void* ("pointer" or "thread args")
                     void* p = va_arg(ap, void*);
                     if (p == NULL) {
                         msg += "NULL";
@@ -677,6 +678,8 @@
                     checkReleaseMode(va_arg(ap, jint));
                 } else if (ch == 's') {
                     checkString(va_arg(ap, jstring));
+                } else if (ch == 't') {
+                    checkThreadArgs(va_arg(ap, void*));
                 } else if (ch == 'u') {
                     if ((mFlags & kFlag_Release) != 0) {
                         checkNonNull(va_arg(ap, const char*));
@@ -822,6 +825,14 @@
         checkInstance(s, gDvm.classJavaLangString, "jstring");
     }
 
+    void checkThreadArgs(void* thread_args) {
+        JavaVMAttachArgs* args = static_cast<JavaVMAttachArgs*>(thread_args);
+        if (args != NULL && args->version < JNI_VERSION_1_2) {
+            ALOGW("JNI WARNING: bad value for JNI version (%d) (%s)", args->version, mFunctionName);
+            abortMaybe();
+        }
+    }
+
     void checkThread(int flags) {
         // Get the *correct* JNIEnv by going through our TLS pointer.
         JNIEnvExt* threadEnv = dvmGetJNIEnvForThread();
@@ -1985,12 +1996,6 @@
 
 static jobject Check_NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
     CHECK_JNI_ENTRY(kFlag_Default, "EpJ", env, address, capacity);
-    if (address == NULL || capacity < 0) {
-        ALOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)",
-            address, (long) capacity);
-        abortMaybe();
-        return NULL;
-    }
     return CHECK_JNI_EXIT("L", baseEnv(env)->NewDirectByteBuffer(env, address, capacity));
 }
 
@@ -2021,13 +2026,13 @@
 
 static jint Check_AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
     ScopedCheck sc(false, __FUNCTION__);
-    sc.check(true, "vpp", vm, p_env, thr_args);
+    sc.check(true, "vpt", vm, p_env, thr_args);
     return CHECK_JNI_EXIT("I", baseVm(vm)->AttachCurrentThread(vm, p_env, thr_args));
 }
 
 static jint Check_AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
     ScopedCheck sc(false, __FUNCTION__);
-    sc.check(true, "vpp", vm, p_env, thr_args);
+    sc.check(true, "vpt", vm, p_env, thr_args);
     return CHECK_JNI_EXIT("I", baseVm(vm)->AttachCurrentThreadAsDaemon(vm, p_env, thr_args));
 }
 
diff --git a/vm/DvmDex.cpp b/vm/DvmDex.cpp
index 035c598..28cd64e 100644
--- a/vm/DvmDex.cpp
+++ b/vm/DvmDex.cpp
@@ -79,6 +79,8 @@
 
     pDvmDex->pInterfaceCache = dvmAllocAtomicCache(DEX_INTERFACE_CACHE_SIZE);
 
+    dvmInitMutex(&pDvmDex->modLock);
+
     return pDvmDex;
 }
 
@@ -184,6 +186,8 @@
     if (pDvmDex == NULL)
         return;
 
+    dvmDestroyMutex(&pDvmDex->modLock);
+
     totalSize  = pDvmDex->pHeader->stringIdsSize * sizeof(struct StringObject*);
     totalSize += pDvmDex->pHeader->typeIdsSize * sizeof(struct ClassObject*);
     totalSize += pDvmDex->pHeader->methodIdsSize * sizeof(struct Method*);
diff --git a/vm/Exception.cpp b/vm/Exception.cpp
index de6d9a9..ca76140 100644
--- a/vm/Exception.cpp
+++ b/vm/Exception.cpp
@@ -1271,13 +1271,10 @@
 void dvmThrowExceptionInInitializerError()
 {
     /*
-     * TODO: Do we want to wrap it if the original is an Error rather than
-     * an Exception?
-     *
      * TODO: Should this just use dvmWrapException()?
      */
 
-    if (gDvm.exExceptionInInitializerError == NULL) {
+    if (gDvm.exExceptionInInitializerError == NULL || gDvm.exError == NULL) {
         /*
          * ExceptionInInitializerError isn't itself initialized. This
          * can happen very early during VM startup if there is a
@@ -1294,6 +1291,11 @@
     Thread* self = dvmThreadSelf();
     Object* exception = dvmGetException(self);
 
+    // We only wrap non-Error exceptions; an Error can just be used as-is.
+    if (dvmInstanceof(exception->clazz, gDvm.exError)) {
+        return;
+    }
+
     dvmAddTrackedAlloc(exception, self);
     dvmClearException(self);
 
diff --git a/vm/Globals.h b/vm/Globals.h
index 565c92a..234a57d 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -268,7 +268,7 @@
     ClassObject* classJavaLangReflectMethod;
     ClassObject* classJavaLangReflectMethodArray;
     ClassObject* classJavaLangReflectProxy;
-    ClassObject* classJavaNioReadWriteDirectByteBuffer;
+    ClassObject* classJavaNioDirectByteBuffer;
     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationFactory;
     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMember;
     ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMemberArray;
@@ -415,7 +415,7 @@
     Method*     methDalvikSystemNativeStart_run;
 
     /* assorted direct buffer helpers */
-    Method*     methJavaNioReadWriteDirectByteBuffer_init;
+    Method*     methJavaNioDirectByteBuffer_init;
     int         offJavaNioBuffer_capacity;
     int         offJavaNioBuffer_effectiveDirectAddress;
 
diff --git a/vm/Hash.cpp b/vm/Hash.cpp
index bf57ae1..cd4530a 100644
--- a/vm/Hash.cpp
+++ b/vm/Hash.cpp
@@ -290,9 +290,11 @@
  */
 int dvmHashForeachRemove(HashTable* pHashTable, HashForeachRemoveFunc func)
 {
-    int i, val;
+    int i, val, tableSize;
 
-    for (i = 0; i < pHashTable->tableSize; i++) {
+    tableSize = pHashTable->tableSize;
+
+    for (i = 0; i < tableSize; i++) {
         HashEntry* pEnt = &pHashTable->pEntries[i];
 
         if (pEnt->data != NULL && pEnt->data != HASH_TOMBSTONE) {
@@ -318,9 +320,11 @@
  */
 int dvmHashForeach(HashTable* pHashTable, HashForeachFunc func, void* arg)
 {
-    int i, val;
+    int i, val, tableSize;
 
-    for (i = 0; i < pHashTable->tableSize; i++) {
+    tableSize = pHashTable->tableSize;
+
+    for (i = 0; i < tableSize; i++) {
         HashEntry* pEnt = &pHashTable->pEntries[i];
 
         if (pEnt->data != NULL && pEnt->data != HASH_TOMBSTONE) {
diff --git a/vm/InitRefs.cpp b/vm/InitRefs.cpp
index c483604..d8f0697 100644
--- a/vm/InitRefs.cpp
+++ b/vm/InitRefs.cpp
@@ -127,7 +127,7 @@
         { &gDvm.classJavaLangReflectMethod,             "Ljava/lang/reflect/Method;" },
         { &gDvm.classJavaLangReflectMethodArray,        "[Ljava/lang/reflect/Method;"},
         { &gDvm.classJavaLangReflectProxy,              "Ljava/lang/reflect/Proxy;" },
-        { &gDvm.classJavaNioReadWriteDirectByteBuffer,  "Ljava/nio/ReadWriteDirectByteBuffer;" },
+        { &gDvm.classJavaNioDirectByteBuffer,           "Ljava/nio/DirectByteBuffer;" },
         { &gDvm.classOrgApacheHarmonyDalvikDdmcChunk,
           "Lorg/apache/harmony/dalvik/ddmc/Chunk;" },
         { &gDvm.classOrgApacheHarmonyDalvikDdmcDdmServer,
@@ -251,7 +251,7 @@
 
     static struct FieldInfo infoBuffer[] = {
         { &gDvm.offJavaNioBuffer_capacity,               "capacity",               "I" },
-        { &gDvm.offJavaNioBuffer_effectiveDirectAddress, "effectiveDirectAddress", "I" },
+        { &gDvm.offJavaNioBuffer_effectiveDirectAddress, "effectiveDirectAddress", "J" },
         { NULL, NULL, NULL }
     };
 
@@ -331,7 +331,7 @@
         { &gDvm.methJavaLangReflectMethod_init, "Ljava/lang/reflect/Method;",
           "(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/Class;"
           "Ljava/lang/String;I)V" },
-        { &gDvm.methJavaNioReadWriteDirectByteBuffer_init, "Ljava/nio/ReadWriteDirectByteBuffer;",
+        { &gDvm.methJavaNioDirectByteBuffer_init, "Ljava/nio/DirectByteBuffer;",
           "(II)V" },
         { &gDvm.methOrgApacheHarmonyLangAnnotationAnnotationMember_init,
           "Lorg/apache/harmony/lang/annotation/AnnotationMember;",
diff --git a/vm/Jni.cpp b/vm/Jni.cpp
index 6decaed..f235835 100644
--- a/vm/Jni.cpp
+++ b/vm/Jni.cpp
@@ -19,6 +19,7 @@
  */
 #include "Dalvik.h"
 #include "JniInternal.h"
+#include "Misc.h"
 #include "ScopedPthreadMutexLock.h"
 #include "UniquePtr.h"
 
@@ -134,6 +135,11 @@
 
 */
 
+static void ReportJniError() {
+    dvmDumpThread(dvmThreadSelf(), false);
+    dvmAbort();
+}
+
 #ifdef WITH_JNI_STACK_CHECK
 # define COMPUTE_STACK_SUM(_self)   computeStackSum(_self);
 # define CHECK_STACK_SUM(_self)     checkStackSum(_self);
@@ -177,7 +183,7 @@
             ALOGD("JNI: bad stack CRC (0x%08x) -- okay during JNI_OnLoad", stackCrc);
         } else {
             ALOGW("JNI: bad stack CRC (%08x vs %08x)", crc, stackCrc);
-            dvmAbort();
+            ReportJniError();
         }
     }
     self->stackCrc = (u4) -1;       /* make logic errors more noticeable */
@@ -318,7 +324,7 @@
             Object* result = self->jniLocalRefTable.get(jobj);
             if (UNLIKELY(result == NULL)) {
                 ALOGE("JNI ERROR (app bug): use of deleted local reference (%p)", jobj);
-                dvmAbort();
+                ReportJniError();
             }
             return result;
         }
@@ -330,7 +336,7 @@
             Object* result = pRefTable->get(jobj);
             if (UNLIKELY(result == NULL)) {
                 ALOGE("JNI ERROR (app bug): use of deleted global reference (%p)", jobj);
-                dvmAbort();
+                ReportJniError();
             }
             return result;
         }
@@ -344,7 +350,7 @@
                 result = NULL;
             } else if (UNLIKELY(result == NULL)) {
                 ALOGE("JNI ERROR (app bug): use of deleted weak global reference (%p)", jobj);
-                dvmAbort();
+                ReportJniError();
             }
             return result;
         }
@@ -355,7 +361,7 @@
             return reinterpret_cast<Object*>(jobj);
         }
         ALOGW("Invalid indirect reference %p in decodeIndirectRef", jobj);
-        dvmAbort();
+        ReportJniError();
         return kInvalidIndirectRefObject;
     }
 }
@@ -363,8 +369,7 @@
 static void AddLocalReferenceFailure(IndirectRefTable* pRefTable) {
     pRefTable->dump("JNI local");
     ALOGE("Failed adding to JNI local ref table (has %zd entries)", pRefTable->capacity());
-    dvmDumpThread(dvmThreadSelf(), false);
-    dvmAbort();     // spec says call FatalError; this is equivalent
+    ReportJniError(); // spec says call FatalError; this is equivalent
 }
 
 /*
@@ -388,6 +393,7 @@
     if (UNLIKELY(jobj == NULL)) {
         AddLocalReferenceFailure(pRefTable);
     }
+
     if (UNLIKELY(gDvmJni.workAroundAppJniBugs)) {
         // Hand out direct pointers to support broken old apps.
         return reinterpret_cast<jobject>(obj);
@@ -486,7 +492,7 @@
         gDvm.jniGlobalRefTable.dump("JNI global");
         ALOGE("Failed adding to JNI global ref table (%zd entries)",
                 gDvm.jniGlobalRefTable.capacity());
-        dvmAbort();
+        ReportJniError();
     }
 
     LOGVV("GREF add %p  (%s.%s)", obj,
@@ -509,7 +515,7 @@
                 } else {
                     gDvm.jniGlobalRefTable.dump("JNI global");
                     ALOGE("Excessive JNI global references (%d)", count);
-                    dvmAbort();
+                    ReportJniError();
                 }
             }
         }
@@ -528,7 +534,7 @@
     if (jobj == NULL) {
         gDvm.jniWeakGlobalRefTable.dump("JNI weak global");
         ALOGE("Failed adding to JNI weak global ref table (%zd entries)", table->capacity());
-        dvmAbort();
+        ReportJniError();
     }
     return jobj;
 }
@@ -591,8 +597,7 @@
         dvmDumpReferenceTable(&gDvm.jniPinRefTable, "JNI pinned array");
         ALOGE("Failed adding to JNI pinned array ref table (%d entries)",
            (int) dvmReferenceTableEntries(&gDvm.jniPinRefTable));
-        dvmDumpThread(dvmThreadSelf(), false);
-        dvmAbort();
+        ReportJniError();
     }
 
     /*
@@ -650,6 +655,31 @@
     dvmDumpReferenceTable(&gDvm.jniPinRefTable, "JNI pinned array");
 }
 
+void dvmDumpJniStats(DebugOutputTarget* target) {
+    dvmPrintDebugMessage(target, "JNI: CheckJNI is %s", gDvmJni.useCheckJni ? "on" : "off");
+    if (gDvmJni.forceCopy) {
+        dvmPrintDebugMessage(target, " (with forcecopy)");
+    }
+    dvmPrintDebugMessage(target, "; workarounds are %s", gDvmJni.workAroundAppJniBugs ? "on" : "off");
+
+    dvmLockMutex(&gDvm.jniPinRefLock);
+    dvmPrintDebugMessage(target, "; pins=%d", dvmReferenceTableEntries(&gDvm.jniPinRefTable));
+    dvmUnlockMutex(&gDvm.jniPinRefLock);
+
+    dvmLockMutex(&gDvm.jniGlobalRefLock);
+    dvmPrintDebugMessage(target, "; globals=%d", gDvm.jniGlobalRefTable.capacity());
+    dvmUnlockMutex(&gDvm.jniGlobalRefLock);
+
+    dvmLockMutex(&gDvm.jniWeakGlobalRefLock);
+    size_t weaks = gDvm.jniWeakGlobalRefTable.capacity();
+    if (weaks > 0) {
+        dvmPrintDebugMessage(target, " (plus %d weak)", weaks);
+    }
+    dvmUnlockMutex(&gDvm.jniWeakGlobalRefLock);
+
+    dvmPrintDebugMessage(target, "\n\n");
+}
+
 /*
  * Verify that a reference passed in from native code is one that the
  * code is allowed to have.
@@ -958,14 +988,14 @@
 
         if (!dvmInitReferenceTable(refTable, kInitialSize, INT_MAX)) {
             ALOGE("Unable to initialize monitor tracking table");
-            dvmAbort();
+            ReportJniError();
         }
     }
 
     if (!dvmAddToReferenceTable(refTable, obj)) {
         /* ran out of memory? could throw exception instead */
         ALOGE("Unable to add entry to monitor tracking table");
-        dvmAbort();
+        ReportJniError();
     } else {
         LOGVV("--- added monitor %p", obj);
     }
@@ -1402,7 +1432,7 @@
 static void FatalError(JNIEnv* env, const char* msg) {
     //dvmChangeStatus(NULL, THREAD_RUNNING);
     ALOGE("JNI posting fatal error: %s", msg);
-    dvmAbort();
+    ReportJniError();
 }
 
 /*
@@ -2683,15 +2713,21 @@
 
 /*
  * Allocate and return a new java.nio.ByteBuffer for this block of memory.
- *
- * "address" may not be NULL, and "capacity" must be > 0.  (These are only
- * verified when CheckJNI is enabled.)
  */
 static jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) {
     ScopedJniThreadState ts(env);
 
-    /* create an instance of java.nio.ReadWriteDirectByteBuffer */
-    ClassObject* bufferClazz = gDvm.classJavaNioReadWriteDirectByteBuffer;
+    if (capacity < 0) {
+        ALOGE("JNI ERROR (app bug): negative buffer capacity: %lld", capacity);
+        ReportJniError();
+    }
+    if (address == NULL && capacity != 0) {
+        ALOGE("JNI ERROR (app bug): non-zero capacity for NULL pointer: %lld", capacity);
+        ReportJniError();
+    }
+
+    /* create an instance of java.nio.DirectByteBuffer */
+    ClassObject* bufferClazz = gDvm.classJavaNioDirectByteBuffer;
     if (!dvmIsClassInitialized(bufferClazz) && !dvmInitClass(bufferClazz)) {
         return NULL;
     }
@@ -2702,7 +2738,7 @@
     /* call the constructor */
     jobject result = addLocalReference(ts.self(), newObj);
     JValue unused;
-    dvmCallMethod(ts.self(), gDvm.methJavaNioReadWriteDirectByteBuffer_init,
+    dvmCallMethod(ts.self(), gDvm.methJavaNioDirectByteBuffer_init,
             newObj, &unused, (jint) address, (jint) capacity);
     if (dvmGetException(ts.self()) != NULL) {
         deleteLocalReference(ts.self(), result);
@@ -2721,7 +2757,7 @@
 
     // All Buffer objects have an effectiveDirectAddress field.
     Object* bufObj = dvmDecodeIndirectRef(ts.self(), jbuf);
-    return (void*) dvmGetFieldInt(bufObj, gDvm.offJavaNioBuffer_effectiveDirectAddress);
+    return (void*) dvmGetFieldLong(bufObj, gDvm.offJavaNioBuffer_effectiveDirectAddress);
 }
 
 /*
@@ -2809,8 +2845,6 @@
         argsCopy.name = NULL;
         argsCopy.group = (jobject) dvmGetMainThreadGroup();
     } else {
-        assert(args->version >= JNI_VERSION_1_2);
-
         argsCopy.version = args->version;
         argsCopy.name = args->name;
         if (args->group != NULL) {
diff --git a/vm/JniInternal.h b/vm/JniInternal.h
index df92df6..8bb5975 100644
--- a/vm/JniInternal.h
+++ b/vm/JniInternal.h
@@ -162,4 +162,8 @@
  */
 void dvmDumpJniReferenceTables(void);
 
+// Dumps JNI statistics in response to SIGQUIT.
+struct DebugOutputTarget;
+void dvmDumpJniStats(DebugOutputTarget* target);
+
 #endif  // DALVIK_JNIINTERNAL_H_
diff --git a/vm/Misc.cpp b/vm/Misc.cpp
index 1f01c2f..057b90d 100644
--- a/vm/Misc.cpp
+++ b/vm/Misc.cpp
@@ -624,6 +624,7 @@
         return NULL;
     }
     if (ret == -1) {
+        munmap(base, byteCount);
         return NULL;
     }
     return base;
diff --git a/vm/ReconfigureDvm.mk b/vm/ReconfigureDvm.mk
index 34eb0a4..6e161c9 100644
--- a/vm/ReconfigureDvm.mk
+++ b/vm/ReconfigureDvm.mk
@@ -21,13 +21,14 @@
 
 include $(LOCAL_PATH)/Dvm.mk
 
-LOCAL_SHARED_LIBRARIES += liblog libcutils libnativehelper libz libdl libcorkscrew
-
-ifeq ($(HAVE_SELINUX),true)
-LOCAL_C_INCLUDES += external/libselinux/include
-LOCAL_SHARED_LIBRARIES += libselinux
-LOCAL_CFLAGS += -DHAVE_SELINUX
-endif # HAVE_SELINUX
+LOCAL_SHARED_LIBRARIES += \
+	libcorkscrew \
+	libcutils \
+	libdl \
+	liblog \
+	libnativehelper \
+	libselinux \
+	libz
 
 LOCAL_STATIC_LIBRARIES += libdex
 
diff --git a/vm/SignalCatcher.cpp b/vm/SignalCatcher.cpp
index c29f19a..a4beb6b 100644
--- a/vm/SignalCatcher.cpp
+++ b/vm/SignalCatcher.cpp
@@ -120,6 +120,7 @@
         ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
     printProcessName(&target);
     dvmPrintDebugMessage(&target, "\n");
+    dvmDumpJniStats(&target);
     dvmDumpAllThreadsEx(&target, true);
     fprintf(fp, "----- end %d -----\n", pid);
 }
@@ -151,6 +152,7 @@
         /* just dump to log */
         DebugOutputTarget target;
         dvmCreateLogOutputTarget(&target, ANDROID_LOG_INFO, LOG_TAG);
+        dvmDumpJniStats(&target);
         dvmDumpAllThreadsEx(&target, true);
     } else {
         /* write to memory buffer */
diff --git a/vm/Sync.cpp b/vm/Sync.cpp
index 810107d..f42004c 100644
--- a/vm/Sync.cpp
+++ b/vm/Sync.cpp
@@ -101,10 +101,6 @@
         ALOGE("Unable to allocate monitor");
         dvmAbort();
     }
-    if (((u4)mon & 7) != 0) {
-        ALOGE("Misaligned monitor: %p", mon);
-        dvmAbort();
-    }
     mon->obj = obj;
     dvmInitMutex(&mon->lock);
 
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index 7f6f583..ded6f0f 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -1301,8 +1301,8 @@
 
     ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
     pthread_t threadHandle;
-    int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart,
-                            newThread);
+    int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart, newThread);
+    pthread_attr_destroy(&threadAttr);
     dvmChangeStatus(self, oldStatus);
 
     if (cc != 0) {
@@ -1311,11 +1311,13 @@
          * resource limits.  VirtualMachineError is probably too severe,
          * so use OutOfMemoryError.
          */
-        ALOGE("Thread creation failed (err=%s)", strerror(errno));
+        ALOGE("pthread_create (stack size %d bytes) failed: %s", stackSize, strerror(cc));
 
         dvmSetFieldObject(threadObj, gDvm.offJavaLangThread_vmThread, NULL);
 
-        dvmThrowOutOfMemoryError("thread creation failed");
+        dvmThrowExceptionFmt(gDvm.exOutOfMemoryError,
+                             "pthread_create (stack size %d bytes) failed: %s",
+                             stackSize, strerror(cc));
         goto fail;
     }
 
@@ -1636,7 +1638,6 @@
 {
     InternalStartArgs* pArgs;
     Object* systemGroup;
-    pthread_attr_t threadAttr;
     volatile Thread* newThread = NULL;
     volatile int createStatus = 0;
 
@@ -1653,13 +1654,13 @@
     pArgs->pThread = &newThread;
     pArgs->pCreateStatus = &createStatus;
 
+    pthread_attr_t threadAttr;
     pthread_attr_init(&threadAttr);
-    //pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
 
-    if (pthread_create(pHandle, &threadAttr, internalThreadStart,
-            pArgs) != 0)
-    {
-        ALOGE("internal thread creation failed");
+    int cc = pthread_create(pHandle, &threadAttr, internalThreadStart, pArgs);
+    pthread_attr_destroy(&threadAttr);
+    if (cc != 0) {
+        ALOGE("internal thread creation failed: %s", strerror(cc));
         free(pArgs->name);
         free(pArgs);
         return false;
@@ -2146,13 +2147,14 @@
         gDvm.nonDaemonThreadCount--;        // guarded by thread list lock
 
         if (gDvm.nonDaemonThreadCount == 0) {
-            int cc;
-
             ALOGV("threadid=%d: last non-daemon thread", self->threadId);
             //dvmDumpAllThreads(false);
             // cond var guarded by threadListLock, which we already hold
-            cc = pthread_cond_signal(&gDvm.vmExitCond);
-            assert(cc == 0);
+            int cc = pthread_cond_signal(&gDvm.vmExitCond);
+            if (cc != 0) {
+                ALOGE("pthread_cond_signal(&gDvm.vmExitCond) failed: %s", strerror(cc));
+                dvmAbort();
+            }
         }
     }
 
@@ -2630,7 +2632,6 @@
 {
     Thread* self = dvmThreadSelf();
     Thread* thread;
-    int cc;
 
     lockThreadSuspend("res-all", why);  /* one suspend/resume at a time */
     LOG_THREAD("threadid=%d: ResumeAll starting", self->threadId);
@@ -2708,8 +2709,11 @@
      * which may choose to wake up.  No need to wait for them.
      */
     lockThreadSuspendCount();
-    cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
-    assert(cc == 0);
+    int cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
+    if (cc != 0) {
+        ALOGE("pthread_cond_broadcast(&gDvm.threadSuspendCountCond) failed: %s", strerror(cc));
+        dvmAbort();
+    }
     unlockThreadSuspendCount();
 
     LOG_THREAD("threadid=%d: ResumeAll complete", self->threadId);
@@ -2723,7 +2727,6 @@
 {
     Thread* self = dvmThreadSelf();
     Thread* thread;
-    int cc;
 
     lockThreadSuspend("undo", SUSPEND_FOR_DEBUG);
     LOG_THREAD("threadid=%d: UndoDebuggerSusp starting", self->threadId);
@@ -2757,8 +2760,11 @@
      * which may choose to wake up.  No need to wait for them.
      */
     lockThreadSuspendCount();
-    cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
-    assert(cc == 0);
+    int cc = pthread_cond_broadcast(&gDvm.threadSuspendCountCond);
+    if (cc != 0) {
+        ALOGE("pthread_cond_broadcast(&gDvm.threadSuspendCountCond) failed: %s", strerror(cc));
+        dvmAbort();
+    }
     unlockThreadSuspendCount();
 
     unlockThreadSuspend();
@@ -3488,13 +3494,12 @@
     snprintf(path, sizeof(path), "/proc/%d/task", getpid());
 
     DIR* d = opendir(path);
-    if (d) {
-        dirent de;
-        dirent* result;
+    if (d != NULL) {
+        dirent* entry = NULL;
         bool first = true;
-        while (!readdir_r(d, &de, &result) && result) {
+        while ((entry = readdir(d)) != NULL) {
             char* end;
-            pid_t tid = strtol(de.d_name, &end, 10);
+            pid_t tid = strtol(entry->d_name, &end, 10);
             if (!*end && !isDalvikThread(tid)) {
                 if (first) {
                     dvmPrintDebugMessage(target, "NATIVE THREADS:\n");
diff --git a/vm/alloc/DdmHeap.cpp b/vm/alloc/DdmHeap.cpp
index 45b0a26..0f1fc31 100644
--- a/vm/alloc/DdmHeap.cpp
+++ b/vm/alloc/DdmHeap.cpp
@@ -189,6 +189,10 @@
 
 static void flush_hpsg_chunk(HeapChunkContext *ctx)
 {
+    if (ctx->pieceLenField == NULL && ctx->needHeader) {
+        /* Already flushed */
+        return;
+    }
     /* Patch the "length of piece" field.
      */
     assert(ctx->buf <= ctx->pieceLenField &&
diff --git a/vm/compiler/codegen/arm/Assemble.cpp b/vm/compiler/codegen/arm/Assemble.cpp
index d1ecd97..7406d3e 100644
--- a/vm/compiler/codegen/arm/Assemble.cpp
+++ b/vm/compiler/codegen/arm/Assemble.cpp
@@ -952,6 +952,7 @@
         if (lir->opcode == kThumbLdrPcRel ||
             lir->opcode == kThumb2LdrPcRel12 ||
             lir->opcode == kThumbAddPcRel ||
+            ((lir->opcode == kThumb2Vldrd) && (lir->operands[1] == r15pc)) ||
             ((lir->opcode == kThumb2Vldrs) && (lir->operands[1] == r15pc))) {
             ArmLIR *lirTarget = (ArmLIR *) lir->generic.target;
             intptr_t pc = (lir->generic.offset + 4) & ~3;
@@ -976,7 +977,7 @@
                 }
                 return kRetryHalve;
             }
-            if (lir->opcode == kThumb2Vldrs) {
+            if ((lir->opcode == kThumb2Vldrs) || (lir->opcode == kThumb2Vldrd)) {
                 lir->operands[2] = delta >> 2;
             } else {
                 lir->operands[1] = (lir->opcode == kThumb2LdrPcRel12) ?
diff --git a/vm/compiler/codegen/arm/CodegenCommon.cpp b/vm/compiler/codegen/arm/CodegenCommon.cpp
index 07f3ac7..5c02678 100644
--- a/vm/compiler/codegen/arm/CodegenCommon.cpp
+++ b/vm/compiler/codegen/arm/CodegenCommon.cpp
@@ -368,6 +368,25 @@
     return NULL;
 }
 
+/* Search the existing constants in the literal pool for an exact wide match */
+ArmLIR* scanLiteralPoolWide(LIR* dataTarget, int valLo, int valHi)
+{
+  bool lowMatch = false;
+  ArmLIR* lowTarget = NULL;
+  while (dataTarget) {
+    if (lowMatch && (((ArmLIR *)dataTarget)->operands[0] == valHi)) {
+      return lowTarget;
+    }
+    lowMatch = false;
+    if (((ArmLIR *) dataTarget)->operands[0] == valLo) {
+      lowMatch = true;
+      lowTarget = (ArmLIR *) dataTarget;
+    }
+    dataTarget = dataTarget->next;
+  }
+  return NULL;
+}
+
 /*
  * The following are building blocks to insert constants into the pool or
  * instruction streams.
@@ -392,6 +411,14 @@
     return NULL;
 }
 
+/* Add a 64-bit constant to the literal pool or mixed with code */
+ArmLIR* addWideData(CompilationUnit* cUnit, LIR** constantListP,
+                 int valLo, int valHi)
+{
+    addWordData(cUnit, constantListP, valHi);
+    return addWordData(cUnit, constantListP, valLo);
+}
+
 static RegLocation inlinedTargetWide(CompilationUnit *cUnit, MIR *mir,
                                       bool fpHint)
 {
diff --git a/vm/compiler/codegen/arm/Thumb2/Factory.cpp b/vm/compiler/codegen/arm/Thumb2/Factory.cpp
index 9c9ce13..c3c3712 100644
--- a/vm/compiler/codegen/arm/Thumb2/Factory.cpp
+++ b/vm/compiler/codegen/arm/Thumb2/Factory.cpp
@@ -53,7 +53,14 @@
 {
     int encodedImm = encodeImmSingle(value);
     assert(SINGLEREG(rDest));
-    if (encodedImm >= 0) {
+    if (value == 0) {
+      // TODO: we need better info about the target CPU.  a vector exclusive or
+      //       would probably be better here if we could rely on its existance.
+      // Load an immediate +2.0 (which encodes to 0)
+      newLIR2(cUnit, kThumb2Vmovs_IMM8, rDest, 0);
+      // +0.0 = +2.0 - +2.0
+      return newLIR3(cUnit, kThumb2Vsubs, rDest, rDest, rDest);
+    } else if (encodedImm >= 0) {
         return newLIR2(cUnit, kThumb2Vmovs_IMM8, rDest, encodedImm);
     }
     ArmLIR *dataTarget = scanLiteralPool(cUnit->literalList, value, 0);
@@ -696,9 +703,34 @@
 {
     int encodedImm = encodeImmDouble(valLo, valHi);
     ArmLIR *res;
-    if (FPREG(rDestLo) && (encodedImm >= 0)) {
-        res = newLIR2(cUnit, kThumb2Vmovd_IMM8, S2D(rDestLo, rDestHi),
-                      encodedImm);
+    int targetReg = S2D(rDestLo, rDestHi);
+    if (FPREG(rDestLo)) {
+        if ((valLo == 0) && (valHi == 0)) {
+          // TODO: we need better info about the target CPU.  a vector
+          // exclusive or would probably be better here if we could rely on
+          // its existance.
+          // Load an immediate +2.0 (which encodes to 0)
+          newLIR2(cUnit, kThumb2Vmovd_IMM8, targetReg, 0);
+          // +0.0 = +2.0 - +2.0
+          res = newLIR3(cUnit, kThumb2Vsubd, targetReg, targetReg, targetReg);
+        } else if (encodedImm >= 0) {
+            res = newLIR2(cUnit, kThumb2Vmovd_IMM8, targetReg, encodedImm);
+        } else {
+            ArmLIR* dataTarget = scanLiteralPoolWide(cUnit->literalList, valLo, valHi);
+            if (dataTarget == NULL) {
+                dataTarget = addWideData(cUnit, &cUnit->literalList, valLo, valHi);
+            }
+            ArmLIR *loadPcRel = (ArmLIR *) dvmCompilerNew(sizeof(ArmLIR), true);
+            loadPcRel->opcode = kThumb2Vldrd;
+            loadPcRel->generic.target = (LIR *) dataTarget;
+            loadPcRel->operands[0] = targetReg;
+            loadPcRel->operands[1] = r15pc;
+            setupResourceMasks(loadPcRel);
+            setMemRefType(loadPcRel, true, kLiteral);
+            loadPcRel->aliasInfo = dataTarget->operands[0];
+            dvmCompilerAppendLIR(cUnit, (LIR *) loadPcRel);
+            res =  loadPcRel;
+        }
     } else {
         res = loadConstantNoClobber(cUnit, rDestLo, valLo);
         loadConstantNoClobber(cUnit, rDestHi, valHi);
diff --git a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.cpp b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.cpp
index 3b5c083..713ecfa 100644
--- a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.cpp
+++ b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.cpp
@@ -52,7 +52,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 9; // 512
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 200;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 200;
+    }
     gDvmJit.codeCacheSize = 512*1024;
 
 #if defined(WITH_SELF_VERIFICATION)
diff --git a/vm/compiler/codegen/arm/armv5te/ArchVariant.cpp b/vm/compiler/codegen/arm/armv5te/ArchVariant.cpp
index f2d4815..25d650e 100644
--- a/vm/compiler/codegen/arm/armv5te/ArchVariant.cpp
+++ b/vm/compiler/codegen/arm/armv5te/ArchVariant.cpp
@@ -52,7 +52,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 9; // 512
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 200;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 200;
+    }
     gDvmJit.codeCacheSize = 512*1024;
 
 #if defined(WITH_SELF_VERIFICATION)
diff --git a/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.cpp b/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.cpp
index e3b2724..40ee040 100644
--- a/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.cpp
+++ b/vm/compiler/codegen/arm/armv7-a-neon/ArchVariant.cpp
@@ -47,7 +47,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 12; // 4096
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 40;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 40;
+    }
     gDvmJit.codeCacheSize = 1024*1024;
 
 #if defined(WITH_SELF_VERIFICATION)
diff --git a/vm/compiler/codegen/arm/armv7-a/ArchVariant.cpp b/vm/compiler/codegen/arm/armv7-a/ArchVariant.cpp
index e3b2724..40ee040 100644
--- a/vm/compiler/codegen/arm/armv7-a/ArchVariant.cpp
+++ b/vm/compiler/codegen/arm/armv7-a/ArchVariant.cpp
@@ -47,7 +47,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 12; // 4096
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 40;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 40;
+    }
     gDvmJit.codeCacheSize = 1024*1024;
 
 #if defined(WITH_SELF_VERIFICATION)
diff --git a/vm/compiler/codegen/mips/CodegenDriver.cpp b/vm/compiler/codegen/mips/CodegenDriver.cpp
index fea1d1e..62a9a4f 100644
--- a/vm/compiler/codegen/mips/CodegenDriver.cpp
+++ b/vm/compiler/codegen/mips/CodegenDriver.cpp
@@ -731,6 +731,7 @@
     OpKind firstOp = kOpBkpt;
     OpKind secondOp = kOpBkpt;
     bool callOut = false;
+    bool checkZero = false;
     void *callTgt;
 
     switch (mir->dalvikInsn.opcode) {
@@ -759,12 +760,14 @@
         case OP_DIV_LONG:
         case OP_DIV_LONG_2ADDR:
             callOut = true;
+            checkZero = true;
             callTgt = (void*)__divdi3;
             break;
         case OP_REM_LONG:
         case OP_REM_LONG_2ADDR:
             callOut = true;
             callTgt = (void*)__moddi3;
+            checkZero = true;
             break;
         case OP_AND_LONG_2ADDR:
         case OP_AND_LONG:
@@ -802,9 +805,14 @@
         genLong3Addr(cUnit, mir, firstOp, secondOp, rlDest, rlSrc1, rlSrc2);
     } else {
         dvmCompilerFlushAllRegs(cUnit);   /* Send everything to home location */
+        loadValueDirectWideFixed(cUnit, rlSrc2, r_ARG2, r_ARG3);
         loadValueDirectWideFixed(cUnit, rlSrc1, r_ARG0, r_ARG1);
         LOAD_FUNC_ADDR(cUnit, r_T9, (int) callTgt);
-        loadValueDirectWideFixed(cUnit, rlSrc2, r_ARG2, r_ARG3);
+        if (checkZero) {
+            int tReg = r_T1; // Using fixed registers during call sequence
+            opRegRegReg(cUnit, kOpOr, tReg, r_ARG2, r_ARG3);
+            genRegImmCheck(cUnit, kMipsCondEq, tReg, 0, mir->offset, NULL);
+        }
         opReg(cUnit, kOpBlx, r_T9);
         newLIR3(cUnit, kMipsLw, r_GP, STACK_OFFSET_GP, r_SP);
         dvmCompilerClobberCallRegs(cUnit);
diff --git a/vm/compiler/codegen/mips/mips/ArchVariant.cpp b/vm/compiler/codegen/mips/mips/ArchVariant.cpp
index 9204a58..d720f85 100644
--- a/vm/compiler/codegen/mips/mips/ArchVariant.cpp
+++ b/vm/compiler/codegen/mips/mips/ArchVariant.cpp
@@ -52,7 +52,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 9; // 512
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 200;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 200;
+    }
     gDvmJit.codeCacheSize = 512*1024;
 
 #if defined(WITH_SELF_VERIFICATION)
diff --git a/vm/compiler/codegen/mips/mips/CallingConvention.S b/vm/compiler/codegen/mips/mips/CallingConvention.S
index ab97655..cfe2695 100644
--- a/vm/compiler/codegen/mips/mips/CallingConvention.S
+++ b/vm/compiler/codegen/mips/mips/CallingConvention.S
@@ -24,9 +24,17 @@
     .global dvmJitCalleeSave
     .type dvmJitCalleeSave, %function
 dvmJitCalleeSave:
+#ifdef __mips_hard_float
+    /* For performance reasons, we are not using any "callee saved" */
+    /* fp registers, thus no need to save them.                     */
+#endif
     jr $31
 
     .global dvmJitCalleeRestore
     .type dvmJitCalleeRestore, %function
 dvmJitCalleeRestore:
+#ifdef __mips_hard_float
+    /* For performance reasons, we are not using any "callee saved" */
+    /* fp registers, thus no need to restore them.                  */
+#endif
     jr $31
diff --git a/vm/compiler/codegen/x86/AnalysisO1.cpp b/vm/compiler/codegen/x86/AnalysisO1.cpp
index d7e9726..a9fd5ce 100644
--- a/vm/compiler/codegen/x86/AnalysisO1.cpp
+++ b/vm/compiler/codegen/x86/AnalysisO1.cpp
@@ -864,7 +864,15 @@
             }
 
             if (retCode == 1) {
-                ALOGE("JIT couldn't compile %s%s dex_pc=%d", method->clazz->descriptor, method->name, offsetPC);
+                // We always fall back to the interpreter for OP_INVOKE_OBJECT_INIT_RANGE,
+                // but any other failure is unexpected and should be logged.
+                if (mir->dalvikInsn.opcode != OP_INVOKE_OBJECT_INIT_RANGE) {
+                    ALOGE("JIT couldn't compile %s%s dex_pc=%d opcode=%d",
+                          method->clazz->descriptor,
+                          method->name,
+                          offsetPC,
+                          mir->dalvikInsn.opcode);
+                }
                 return -1;
             }
             updateConstInfo(bb);
@@ -3709,7 +3717,7 @@
        (!strcmp(target, "dvmAllocArrayByClass")) ||
        (!strcmp(target, "dvmAllocPrimitiveArray")) ||
        (!strcmp(target, "dvmInterpHandleFillArrayData")) ||
-       (!strcmp(target, "dvmFindInterfaceMethodInCache2")) ||
+       (!strcmp(target, "dvmFindInterfaceMethodInCache")) ||
        (!strcmp(target, "dvmNcgHandlePackedSwitch")) ||
        (!strcmp(target, "dvmNcgHandleSparseSwitch")) ||
        (!strcmp(target, "dvmCanPutArrayElement")) ||
diff --git a/vm/compiler/codegen/x86/CodegenInterface.cpp b/vm/compiler/codegen/x86/CodegenInterface.cpp
index c99fadd..e7dd8af 100644
--- a/vm/compiler/codegen/x86/CodegenInterface.cpp
+++ b/vm/compiler/codegen/x86/CodegenInterface.cpp
@@ -64,7 +64,9 @@
     /* Target-specific configuration */
     gDvmJit.jitTableSize = 1 << 12;
     gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 255;
+    if (gDvmJit.threshold == 0) {
+        gDvmJit.threshold = 255;
+    }
     gDvmJit.codeCacheSize = 512*1024;
     gDvmJit.optLevel = kJitOptLevelO1;
 
@@ -1237,7 +1239,6 @@
             if(cg_ret < 0) {
                 endOfTrace(true/*freeOnly*/);
                 cUnit->baseAddr = NULL;
-                ALOGI("codeGenBasicBlockJit returns negative number");
                 PROTECT_CODE_CACHE(stream, unprotected_code_cache_bytes);
                 return;
             }
diff --git a/vm/compiler/codegen/x86/LowerHelper.cpp b/vm/compiler/codegen/x86/LowerHelper.cpp
index 4539064..3fec038 100644
--- a/vm/compiler/codegen/x86/LowerHelper.cpp
+++ b/vm/compiler/codegen/x86/LowerHelper.cpp
@@ -42,6 +42,7 @@
 #include "NcgAot.h"
 #include "enc_wrapper.h"
 #include "vm/mterp/Mterp.h"
+#include "vm/mterp/common/FindInterface.h"
 #include "NcgHelper.h"
 #include <math.h>
 #include "interp/InterpState.h"
@@ -2705,18 +2706,18 @@
     return 0;
 }
 
-//!generate native code to call dvmFindInterfaceMethodInCache2
+//!generate native code to call dvmFindInterfaceMethodInCache
 
 //!
 int call_dvmFindInterfaceMethodInCache() {
     typedef Method* (*vmHelper)(ClassObject*, u4, const Method*, DvmDex*);
-    vmHelper funcPtr = dvmFindInterfaceMethodInCache2;
+    vmHelper funcPtr = dvmFindInterfaceMethodInCache;
     if(gDvm.executionMode == kExecutionModeNcgO1) {
-        beforeCall("dvmFindInterfaceMethodInCache2");
-        callFuncPtr((int)funcPtr, "dvmFindInterfaceMethodInCache2");
-        afterCall("dvmFindInterfaceMethodInCache2");
+        beforeCall("dvmFindInterfaceMethodInCache");
+        callFuncPtr((int)funcPtr, "dvmFindInterfaceMethodInCache");
+        afterCall("dvmFindInterfaceMethodInCache");
     } else {
-        callFuncPtr((int)funcPtr, "dvmFindInterfaceMethodInCache2");
+        callFuncPtr((int)funcPtr, "dvmFindInterfaceMethodInCache");
     }
     return 0;
 }
diff --git a/vm/compiler/codegen/x86/NcgHelper.cpp b/vm/compiler/codegen/x86/NcgHelper.cpp
index f9192db..c603d09 100644
--- a/vm/compiler/codegen/x86/NcgHelper.cpp
+++ b/vm/compiler/codegen/x86/NcgHelper.cpp
@@ -102,17 +102,3 @@
     LOGVV("Value %d not found in switch", testVal);
     return 2*3; //bytecode sparse_switch is 6(2*3) bytes long
 }
-/*
- * Look up an interface on a class using the cache.
- */
-/*INLINE*/ Method* dvmFindInterfaceMethodInCache2(ClassObject* thisClass,
-    u4 methodIdx, const Method* method, DvmDex* methodClassDex)
-{
-#define ATOMIC_CACHE_CALC \
-    dvmInterpFindInterfaceMethod(thisClass, methodIdx, method, methodClassDex)
-
-    return (Method*) ATOMIC_CACHE_LOOKUP(methodClassDex->pInterfaceCache,
-                DEX_INTERFACE_CACHE_SIZE, thisClass, methodIdx);
-
-#undef ATOMIC_CACHE_CALC
-}
diff --git a/vm/compiler/codegen/x86/NcgHelper.h b/vm/compiler/codegen/x86/NcgHelper.h
index 888cb61..713f424 100644
--- a/vm/compiler/codegen/x86/NcgHelper.h
+++ b/vm/compiler/codegen/x86/NcgHelper.h
@@ -22,17 +22,6 @@
 s4 dvmNcgHandleSparseSwitch(const s4*, u2, s4);
 s4 dvmJitHandlePackedSwitch(const s4*, s4, u2, s4);
 s4 dvmJitHandleSparseSwitch(const s4*, u2, s4);
-/*
- * Look up an interface on a class using the cache.
- */
-Method* dvmFindInterfaceMethodInCache2(ClassObject* thisClass,
-    u4 methodIdx, const Method* method, DvmDex* methodClassDex);
-/*
- * Find an interface method.
- */
-#if 0
-bool dvmNcgStdRun(MterpGlue* glue);
-#endif
 extern "C" void dvmNcgInvokeInterpreter(int pc); //interpreter to execute at pc
 extern "C" void dvmNcgInvokeNcg(int pc);
 extern "C" void dvmJitToInterpNormal(int targetpc); //in %ebx
diff --git a/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NATIVE.S b/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NATIVE.S
index 2579ff9..7bba88c 100644
--- a/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NATIVE.S
+++ b/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NATIVE.S
@@ -42,11 +42,12 @@
     move   a3, rSELF                              # a3<- self
 #if defined(TEMPLATE_INLINE_PROFILING)
     # a2: methodToCall
-    # preserve a0-a3
+    # preserve rTEMP,a0-a3
     SCRATCH_STORE(a0, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
+    SCRATCH_STORE(rTEMP, 16)
 
     move   a0, a2
     move   a1, rSELF
@@ -55,7 +56,8 @@
     JALR(t9)                                      # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a0-a3
+    SCRATCH_LOAD(rTEMP, 16)
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
@@ -63,8 +65,8 @@
 
     move   rOBJ, a2                               # save a2
 #endif
-
-    JALR(rTEMP)                                   # off to the native code
+    move   t9, rTEMP
+    JALR(t9)                                   # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
 #if defined(TEMPLATE_INLINE_PROFILING)
diff --git a/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NO_OPT.S b/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NO_OPT.S
index d513d1c..06935d7 100644
--- a/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NO_OPT.S
+++ b/vm/compiler/template/mips/TEMPLATE_INVOKE_METHOD_NO_OPT.S
@@ -54,8 +54,8 @@
     move   rFP, a1                                # fp = newFp
     sw     rFP, offThread_curFrame(rSELF)         # self->curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
-    # preserve a0-a3
-    SCRATCH_STORE(a0, 0)
+    # preserve rTEMP,a1-a3
+    SCRATCH_STORE(rTEMP, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
@@ -66,11 +66,11 @@
     JALR(t9)
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a1-a3
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
-    SCRATCH_LOAD(a0, 0)
+    SCRATCH_LOAD(rTEMP, 0)
 #endif
 
     # Start executing the callee
diff --git a/vm/compiler/template/mips/TEMPLATE_PERIODIC_PROFILING.S b/vm/compiler/template/mips/TEMPLATE_PERIODIC_PROFILING.S
index 89031fd..4df771d 100644
--- a/vm/compiler/template/mips/TEMPLATE_PERIODIC_PROFILING.S
+++ b/vm/compiler/template/mips/TEMPLATE_PERIODIC_PROFILING.S
@@ -22,7 +22,7 @@
      sw     a3, 0(a1)
      RETURN
 .L${opcode}_disable_profiling:
-     move   rTEMP, ra                   # preserve ra
      la     a0, dvmJitTraceProfilingOff
      JALR(a0)
-     jr     rTEMP
+     # The ra register is preserved by the JALR macro.
+     jr     ra
diff --git a/vm/compiler/template/mips/footer.S b/vm/compiler/template/mips/footer.S
index 3b59dd9..91442dd 100644
--- a/vm/compiler/template/mips/footer.S
+++ b/vm/compiler/template/mips/footer.S
@@ -29,9 +29,8 @@
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
-    move    rTEMP, a2                            # preserve a2
 
-    move    a0, rTEMP
+    move    a0, a2
     move    a1, rSELF
     la      t9, dvmFastMethodTraceEnter
     JALR(t9)
@@ -47,7 +46,10 @@
     JALR(t9)                                      # call methodToCall->nativeFunc
     lw      gp, STACK_OFFSET_GP(sp)
 
-    move    a0, rTEMP
+    # restore a2 again
+    SCRATCH_LOAD(a2, 8)
+
+    move    a0, a2
     move    a1, rSELF
     la      t9, dvmFastNativeMethodTraceExit
     JALR(t9)
diff --git a/vm/compiler/template/out/CompilerTemplateAsm-mips.S b/vm/compiler/template/out/CompilerTemplateAsm-mips.S
index 401865d..fb8402e 100644
--- a/vm/compiler/template/out/CompilerTemplateAsm-mips.S
+++ b/vm/compiler/template/out/CompilerTemplateAsm-mips.S
@@ -603,8 +603,8 @@
     move   rFP, a1                                # fp = newFp
     sw     rFP, offThread_curFrame(rSELF)         # self->curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
-    # preserve a0-a3
-    SCRATCH_STORE(a0, 0)
+    # preserve rTEMP,a1-a3
+    SCRATCH_STORE(rTEMP, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
@@ -615,11 +615,11 @@
     JALR(t9)
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a1-a3
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
-    SCRATCH_LOAD(a0, 0)
+    SCRATCH_LOAD(rTEMP, 0)
 #endif
 
     # Start executing the callee
@@ -813,11 +813,12 @@
     move   a3, rSELF                              # a3<- self
 #if defined(TEMPLATE_INLINE_PROFILING)
     # a2: methodToCall
-    # preserve a0-a3
+    # preserve rTEMP,a0-a3
     SCRATCH_STORE(a0, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
+    SCRATCH_STORE(rTEMP, 16)
 
     move   a0, a2
     move   a1, rSELF
@@ -826,7 +827,8 @@
     JALR(t9)                                      # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a0-a3
+    SCRATCH_LOAD(rTEMP, 16)
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
@@ -834,8 +836,8 @@
 
     move   rOBJ, a2                               # save a2
 #endif
-
-    JALR(rTEMP)                                   # off to the native code
+    move   t9, rTEMP
+    JALR(t9)                                   # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
 #if defined(TEMPLATE_INLINE_PROFILING)
@@ -2818,10 +2820,10 @@
      sw     a3, 0(a1)
      RETURN
 .LTEMPLATE_PERIODIC_PROFILING_disable_profiling:
-     move   rTEMP, ra                   # preserve ra
      la     a0, dvmJitTraceProfilingOff
      JALR(a0)
-     jr     rTEMP
+     # The ra register is preserved by the JALR macro.
+     jr     ra
 
 /* ------------------------------ */
     .balign 4
@@ -2973,8 +2975,8 @@
     move   rFP, a1                                # fp = newFp
     sw     rFP, offThread_curFrame(rSELF)         # self->curFrame = newFp
 #if defined(TEMPLATE_INLINE_PROFILING)
-    # preserve a0-a3
-    SCRATCH_STORE(a0, 0)
+    # preserve rTEMP,a1-a3
+    SCRATCH_STORE(rTEMP, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
@@ -2985,11 +2987,11 @@
     JALR(t9)
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a1-a3
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
-    SCRATCH_LOAD(a0, 0)
+    SCRATCH_LOAD(rTEMP, 0)
 #endif
 
     # Start executing the callee
@@ -3195,11 +3197,12 @@
     move   a3, rSELF                              # a3<- self
 #if defined(TEMPLATE_INLINE_PROFILING)
     # a2: methodToCall
-    # preserve a0-a3
+    # preserve rTEMP,a0-a3
     SCRATCH_STORE(a0, 0)
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
+    SCRATCH_STORE(rTEMP, 16)
 
     move   a0, a2
     move   a1, rSELF
@@ -3208,7 +3211,8 @@
     JALR(t9)                                      # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
-    # restore a0-a3
+    # restore rTEMP,a0-a3
+    SCRATCH_LOAD(rTEMP, 16)
     SCRATCH_LOAD(a3, 12)
     SCRATCH_LOAD(a2, 8)
     SCRATCH_LOAD(a1, 4)
@@ -3216,8 +3220,8 @@
 
     move   rOBJ, a2                               # save a2
 #endif
-
-    JALR(rTEMP)                                   # off to the native code
+    move   t9, rTEMP
+    JALR(t9)                                   # off to the native code
     lw     gp, STACK_OFFSET_GP(sp)
 
 #if defined(TEMPLATE_INLINE_PROFILING)
@@ -3291,9 +3295,8 @@
     SCRATCH_STORE(a1, 4)
     SCRATCH_STORE(a2, 8)
     SCRATCH_STORE(a3, 12)
-    move    rTEMP, a2                            # preserve a2
 
-    move    a0, rTEMP
+    move    a0, a2
     move    a1, rSELF
     la      t9, dvmFastMethodTraceEnter
     JALR(t9)
@@ -3309,7 +3312,10 @@
     JALR(t9)                                      # call methodToCall->nativeFunc
     lw      gp, STACK_OFFSET_GP(sp)
 
-    move    a0, rTEMP
+    # restore a2 again
+    SCRATCH_LOAD(a2, 8)
+
+    move    a0, a2
     move    a1, rSELF
     la      t9, dvmFastNativeMethodTraceExit
     JALR(t9)
diff --git a/vm/interp/Interp.cpp b/vm/interp/Interp.cpp
index c168c7a..a37e134 100644
--- a/vm/interp/Interp.cpp
+++ b/vm/interp/Interp.cpp
@@ -999,9 +999,6 @@
 s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal)
 {
     const int kInstrLen = 3;
-    u2 size;
-    s4 firstKey;
-    const s4* entries;
 
     /*
      * Packed switch data format:
@@ -1018,13 +1015,14 @@
         return kInstrLen;
     }
 
-    size = *switchData++;
+    u2 size = *switchData++;
     assert(size > 0);
 
-    firstKey = *switchData++;
+    s4 firstKey = *switchData++;
     firstKey |= (*switchData++) << 16;
 
-    if (testVal < firstKey || testVal >= firstKey + size) {
+    int index = testVal - firstKey;
+    if (index < 0 || index >= size) {
         LOGVV("Value %d not found in switch (%d-%d)",
             testVal, firstKey, firstKey+size-1);
         return kInstrLen;
@@ -1033,14 +1031,14 @@
     /* The entries are guaranteed to be aligned on a 32-bit boundary;
      * we can treat them as a native int array.
      */
-    entries = (const s4*) switchData;
+    const s4* entries = (const s4*) switchData;
     assert(((u4)entries & 0x3) == 0);
 
-    assert(testVal - firstKey >= 0 && testVal - firstKey < size);
+    assert(index >= 0 && index < size);
     LOGVV("Value %d found in slot %d (goto 0x%02x)",
-        testVal, testVal - firstKey,
-        s4FromSwitchData(&entries[testVal - firstKey]));
-    return s4FromSwitchData(&entries[testVal - firstKey]);
+        testVal, index,
+        s4FromSwitchData(&entries[index]));
+    return s4FromSwitchData(&entries[index]);
 }
 
 /*
@@ -1910,7 +1908,6 @@
 #endif
     self->debugIsMethodEntry = true;
 #if defined(WITH_JIT)
-    dvmJitCalleeSave(calleeSave);
     /* Initialize the state to kJitNot */
     self->jitState = kJitNot;
 #endif
diff --git a/vm/interp/Stack.cpp b/vm/interp/Stack.cpp
index 9ef92c7..1433f13 100644
--- a/vm/interp/Stack.cpp
+++ b/vm/interp/Stack.cpp
@@ -1253,6 +1253,9 @@
                         if (obj->clazz == gDvm.classJavaLangVMThread) {
                             joinThread = dvmGetThreadFromThreadObject(obj);
                         }
+                        if (joinThread == NULL) {
+                            joinThread = dvmGetObjectLockHolder(obj);
+                        }
                         printWaitMessage(target, "on", obj, joinThread);
                     }
                 } else if (thread->status == THREAD_MONITOR) {
diff --git a/vm/mterp/armv5te/OP_APUT_OBJECT.S b/vm/mterp/armv5te/OP_APUT_OBJECT.S
index 918fcd0..95aec3a 100644
--- a/vm/mterp/armv5te/OP_APUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_APUT_OBJECT.S
@@ -43,8 +43,8 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .L${opcode}_skip_check:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .L${opcode}_throw:
     @ The types don't match.  We need to throw an ArrayStoreException.
diff --git a/vm/mterp/armv5te/OP_CONST_CLASS.S b/vm/mterp/armv5te/OP_CONST_CLASS.S
index 9256bf9..018e1e0 100644
--- a/vm/mterp/armv5te/OP_CONST_CLASS.S
+++ b/vm/mterp/armv5te/OP_CONST_CLASS.S
@@ -11,8 +11,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .L${opcode}_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 %break
 
@@ -30,6 +30,6 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_CONST_STRING.S b/vm/mterp/armv5te/OP_CONST_STRING.S
index bad36e4..0d889dd 100644
--- a/vm/mterp/armv5te/OP_CONST_STRING.S
+++ b/vm/mterp/armv5te/OP_CONST_STRING.S
@@ -11,8 +11,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .L${opcode}_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 %break
 
@@ -29,6 +29,6 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_CONST_STRING_JUMBO.S b/vm/mterp/armv5te/OP_CONST_STRING_JUMBO.S
index 05897f7..6ca6bd1 100644
--- a/vm/mterp/armv5te/OP_CONST_STRING_JUMBO.S
+++ b/vm/mterp/armv5te/OP_CONST_STRING_JUMBO.S
@@ -13,8 +13,8 @@
     cmp     r0, #0
     beq     .L${opcode}_resolve
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 %break
 
@@ -31,6 +31,6 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
index ab89189..f97c4e3 100644
--- a/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
+++ b/vm/mterp/armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S
@@ -1,4 +1,4 @@
-%default { "jumbo":"0", "cccc":"2" }
+%default { "cccc":"2" }
 %verify "executed"
 %verify "finalizable class"
     /*
diff --git a/vm/mterp/armv5te/OP_IPUT.S b/vm/mterp/armv5te/OP_IPUT.S
index 72c05c0..e0aa269 100644
--- a/vm/mterp/armv5te/OP_IPUT.S
+++ b/vm/mterp/armv5te/OP_IPUT.S
@@ -41,8 +41,8 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     $prebarrier                        @ releasing store
     $store  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     $postbarrier
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_IPUT_OBJECT.S b/vm/mterp/armv5te/OP_IPUT_OBJECT.S
index a514f04..8795971 100644
--- a/vm/mterp/armv5te/OP_IPUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_IPUT_OBJECT.S
@@ -42,10 +42,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     $prebarrier                        @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     $postbarrier
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_MOVE_RESULT_WIDE.S b/vm/mterp/armv5te/OP_MOVE_RESULT_WIDE.S
index 4eb0198..ea80de8 100644
--- a/vm/mterp/armv5te/OP_MOVE_RESULT_WIDE.S
+++ b/vm/mterp/armv5te/OP_MOVE_RESULT_WIDE.S
@@ -5,6 +5,6 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_MOVE_WIDE.S b/vm/mterp/armv5te/OP_MOVE_WIDE.S
index 05151e1..0811c95 100644
--- a/vm/mterp/armv5te/OP_MOVE_WIDE.S
+++ b/vm/mterp/armv5te/OP_MOVE_WIDE.S
@@ -8,6 +8,6 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_MOVE_WIDE_16.S b/vm/mterp/armv5te/OP_MOVE_WIDE_16.S
index 172ef03..2b3e99f 100644
--- a/vm/mterp/armv5te/OP_MOVE_WIDE_16.S
+++ b/vm/mterp/armv5te/OP_MOVE_WIDE_16.S
@@ -7,6 +7,6 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv5te/OP_NEW_INSTANCE.S b/vm/mterp/armv5te/OP_NEW_INSTANCE.S
index e280c4c..a03d111 100644
--- a/vm/mterp/armv5te/OP_NEW_INSTANCE.S
+++ b/vm/mterp/armv5te/OP_NEW_INSTANCE.S
@@ -48,8 +48,8 @@
 #endif
 .L${opcode}_end:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r3)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 #if defined(WITH_JIT)
@@ -68,8 +68,8 @@
     mov     r1, rPC
     bl      dvmJitEndTraceSelect        @ (self, pc)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r9, r10)                   @ vAA<- new object
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 #endif
 
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index 5d3e994..2980fa7 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -845,7 +845,6 @@
     ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
     mov     r0, rSELF                   @ r0<- self
     ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
-    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
     mov     r2, r9                      @ r2<- exception
     sub     r1, rPC, r1                 @ r1<- pc - method->insns
     mov     r1, r1, asr #1              @ r1<- offset in code units
diff --git a/vm/mterp/armv6t2/OP_IGET.S b/vm/mterp/armv6t2/OP_IGET.S
index 14ddf44..1cf41fc 100644
--- a/vm/mterp/armv6t2/OP_IGET.S
+++ b/vm/mterp/armv6t2/OP_IGET.S
@@ -40,6 +40,6 @@
     $load   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
     ubfx    r2, rINST, #8, #4           @ r2<- A
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv6t2/OP_IGET_QUICK.S b/vm/mterp/armv6t2/OP_IGET_QUICK.S
index 0ce2ebc..1e913c3 100644
--- a/vm/mterp/armv6t2/OP_IGET_QUICK.S
+++ b/vm/mterp/armv6t2/OP_IGET_QUICK.S
@@ -10,6 +10,6 @@
     beq     common_errNullObject        @ object was null
     ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/armv6t2/OP_IPUT.S b/vm/mterp/armv6t2/OP_IPUT.S
index 4bc8e1b..0b219c0 100644
--- a/vm/mterp/armv6t2/OP_IPUT.S
+++ b/vm/mterp/armv6t2/OP_IPUT.S
@@ -40,6 +40,6 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     $store  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
diff --git a/vm/mterp/common/FindInterface.h b/vm/mterp/common/FindInterface.h
index 72d45ff..23e6f0e 100644
--- a/vm/mterp/common/FindInterface.h
+++ b/vm/mterp/common/FindInterface.h
@@ -31,6 +31,7 @@
 {
 #define ATOMIC_CACHE_CALC \
     dvmInterpFindInterfaceMethod(thisClass, methodIdx, method, methodClassDex)
+#define ATOMIC_CACHE_NULL_ALLOWED false
 
     return (Method*) ATOMIC_CACHE_LOOKUP(methodClassDex->pInterfaceCache,
                 DEX_INTERFACE_CACHE_SIZE, thisClass, methodIdx);
diff --git a/vm/mterp/mips/ALT_OP_DISPATCH_FF.S b/vm/mterp/mips/ALT_OP_DISPATCH_FF.S
deleted file mode 100644
index 0c542a0..0000000
--- a/vm/mterp/mips/ALT_OP_DISPATCH_FF.S
+++ /dev/null
@@ -1,10 +0,0 @@
-%verify "executed"
-/*
- * Unlike other alt stubs, we don't want to call dvmCheckBefore() here.
- * Instead, just treat this as a trampoline to reach the real alt
- * handler (which will do the dvmCheckBefore() call.
- */
-    mov     ip, rINST, lsr #8           @ ip<- extended opcode
-    add     ip, ip, #256                @ add offset for extended opcodes
-    GOTO_OPCODE(ip)                     @ go to proper extended handler
-
diff --git a/vm/mterp/mips/OP_CHECK_CAST_JUMBO.S b/vm/mterp/mips/OP_CHECK_CAST_JUMBO.S
deleted file mode 100644
index 966ffab..0000000
--- a/vm/mterp/mips/OP_CHECK_CAST_JUMBO.S
+++ /dev/null
@@ -1,84 +0,0 @@
-%verify "executed"
-%verify "null object"
-%verify "class cast exception thrown, with correct class name"
-%verify "class cast exception not thrown on same class"
-%verify "class cast exception not thrown on subclass"
-%verify "class not resolved"
-%verify "class already resolved"
-    /*
-     * Check to see if a cast from one class to another is allowed.
-     */
-    /* check-cast/ jumbo vBBBB, class #AAAAAAAA */
-    FETCH(a0, 1)                        # a0<- aaaa (lo)
-    FETCH(a2, 2)                        # a2<- AAAA (hi)
-    FETCH(a3, 3)                        # a3<- BBBB
-    sll    a2,a2,16
-    or     a2, a0, a2                   # a2<- AAAAaaaa
-
-    GET_VREG(rOBJ, a3)                          # rOBJ<- object
-    LOAD_rSELF_methodClassDex(a0)   # a0<- pDvmDex
-    LOAD_base_offDvmDex_pResClasses(a0, a0) # a0<- pDvmDex->pResClasses
-                                                # is object null?
-    beqz     rOBJ, .L${opcode}_okay             # null obj, cast always succeeds
-    LOAD_eas2(a1, a0, a2)           # a1<- resolved class
-    LOAD_base_offObject_clazz(a0, rOBJ)   # a0<- obj->clazz
-                                                # have we resolved this before?
-    beqz    a1, .L${opcode}_resolve             # not resolved, do it now
-.L${opcode}_resolved:
-                                                # same class (trivial success)?
-    bne     a0, a1, .L${opcode}_fullcheck       # no, do full check
-    b       .L${opcode}_okay                    # yes, finish up
-
-    /*
-     * Trivial test failed, need to perform full check.  This is common.
-     *  a0 holds obj->clazz
-     *  a1 holds class resolved from BBBB
-     *  rOBJ holds object
-     */
-.L${opcode}_fullcheck:
-    move      rBIX,a1                      #  avoid ClassObject getting clobbered
-    JAL(dvmInstanceofNonTrivial)    # v0<- boolean result
-                                                # failed?
-    bnez    v0, .L${opcode}_okay                # no, success
-    b       .L${opcode}_castfailure
-
-%break
-
-
-.L${opcode}_castfailure:
-    # A cast has failed.  We need to throw a ClassCastException with the
-    # class of the object that failed to be cast.
-    EXPORT_PC()                                 # about to throw
-    LOAD_base_offObject_clazz(a0, rOBJ)         # a0<- obj->clazz
-    move      a1,rBIX                      #  r1<- desired class
-    JAL(dvmThrowClassCastException)
-    b       common_exceptionThrown
-
-    /*
-     * Advance PC and get next opcode
-     *
-     */
-.L${opcode}_okay:
-    FETCH_ADVANCE_INST(4)                       # advance rPC, load rINST
-    GET_INST_OPCODE(t0)                         # extract opcode from rINST
-    GOTO_OPCODE(t0)                             # jump to next instruction
-    /*
-     * Resolution required.  This is the least-likely path.
-     *
-     *  a2   holds AAAAAAAA
-     *  rOBJ holds object
-     */
-.L${opcode}_resolve:
-    EXPORT_PC()                                 # resolve() could throw
-    LOAD_rSELF_method(a3)           # a3<- self->method
-    move     a1, a2                             # a1<- AAAAAAAA
-    li       a2, 0                              # a2<- false
-    LOAD_base_offMethod_clazz(a0, a3)   # a0<- method->clazz
-    JAL(dvmResolveClass)    # v0<- resolved ClassObject ptr
-                                                # got null?
-    beqz     v0, common_exceptionThrown         # yes, handle exception
-    move     a1, v0                             # a1<- class resolved from AAAAAAAA
-    LOAD_base_offObject_clazz(a0, rOBJ)   # a0<- obj->clazz
-    b       .L${opcode}_resolved                # pick up where we left off
-
-
diff --git a/vm/mterp/mips/OP_CMPL_DOUBLE.S b/vm/mterp/mips/OP_CMPL_DOUBLE.S
index 63bb005..2c824b3 100644
--- a/vm/mterp/mips/OP_CMPL_DOUBLE.S
+++ b/vm/mterp/mips/OP_CMPL_DOUBLE.S
@@ -36,15 +36,15 @@
     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
     b         ${opcode}_continue
 #else
-    LOAD64_F(fs0, fs0f, rOBJ)
-    LOAD64_F(fs1, fs1f, rBIX)
-    c.olt.d   fcc0, fs0, fs1
+    LOAD64_F(ft0, ft0f, rOBJ)
+    LOAD64_F(ft1, ft1f, rBIX)
+    c.olt.d   fcc0, ft0, ft1
     li        rTEMP, -1
     bc1t      fcc0, ${opcode}_finish
-    c.olt.d   fcc0, fs1, fs0
+    c.olt.d   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, ${opcode}_finish
-    c.eq.d    fcc0, fs0, fs1
+    c.eq.d    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, ${opcode}_finish
     b         ${opcode}_nan
diff --git a/vm/mterp/mips/OP_CMPL_FLOAT.S b/vm/mterp/mips/OP_CMPL_FLOAT.S
index 6e07084..01db920 100644
--- a/vm/mterp/mips/OP_CMPL_FLOAT.S
+++ b/vm/mterp/mips/OP_CMPL_FLOAT.S
@@ -45,15 +45,15 @@
     move      a1, rBIX                     #  a1 <- vCC
     b         ${opcode}_continue
 #else
-    GET_VREG_F(fs0, a2)
-    GET_VREG_F(fs1, a3)
-    c.olt.s   fcc0, fs0, fs1               # Is fs0 < fs1
+    GET_VREG_F(ft0, a2)
+    GET_VREG_F(ft1, a3)
+    c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
     li        rTEMP, -1
     bc1t      fcc0, ${opcode}_finish
-    c.olt.s   fcc0, fs1, fs0
+    c.olt.s   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, ${opcode}_finish
-    c.eq.s    fcc0, fs0, fs1
+    c.eq.s    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, ${opcode}_finish
     b         ${opcode}_nan
diff --git a/vm/mterp/mips/OP_CONST_CLASS_JUMBO.S b/vm/mterp/mips/OP_CONST_CLASS_JUMBO.S
deleted file mode 100644
index 05604b9..0000000
--- a/vm/mterp/mips/OP_CONST_CLASS_JUMBO.S
+++ /dev/null
@@ -1,34 +0,0 @@
-%verify "executed"
-%verify "Class already resolved"
-%verify "Class not yet resolved"
-%verify "Class cannot be resolved"
-    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- self->methodClassDex
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResClasses(a2, a2) #  a2 <- dvmDex->pResClasses
-    sll       a1,a1,16
-    or        a1, a0, a1                  # a1<- AAAAaaaa
-    FETCH(rOBJ, 3)                        # rOBJ<- BBBB
-    LOAD_eas2(v0, a2, a1)                  #  v0 <- pResClasses[BBBB]
-
-    bnez      v0, .L${opcode}_resolve      #  v0!=0 => resolved-ok
-    /*
-     * Continuation if the Class has not yet been resolved.
-     *  a1: AAAAAAAA (Class ref)
-     *  rOBJ: target register
-     */
-    EXPORT_PC()
-    LOAD_rSELF_method(a0)                  #  a0 <- self->method
-    li        a2, 1                        #  a2 <- true
-    LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
-    JAL(dvmResolveClass)                   #  v0 <- Class reference
-    # failed==0?
-    beqz      v0, common_exceptionThrown   #  yup, handle the exception
-
-.L${opcode}_resolve:
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    SET_VREG_GOTO(v0, rOBJ, t0)            #  vBBBB <- v0
-
-
diff --git a/vm/mterp/mips/OP_DISPATCH_FF.S b/vm/mterp/mips/OP_DISPATCH_FF.S
deleted file mode 100644
index 0503c33..0000000
--- a/vm/mterp/mips/OP_DISPATCH_FF.S
+++ /dev/null
@@ -1,4 +0,0 @@
-%verify "executed"
-    srl     t0, rINST, 8                # t0<- extended opcode
-    addu    t0, t0, 256                 # add offset for extended opcodes
-    GOTO_OPCODE(t0)                     # go to proper extended handler
diff --git a/vm/mterp/mips/OP_EXECUTE_INLINE.S b/vm/mterp/mips/OP_EXECUTE_INLINE.S
index cbc8917..34f23ea 100644
--- a/vm/mterp/mips/OP_EXECUTE_INLINE.S
+++ b/vm/mterp/mips/OP_EXECUTE_INLINE.S
@@ -91,14 +91,14 @@
     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
     GET_OPB(a0)                            #  a0 <- B
     # Stack should have 16/20 available
-    sw        a1, 16(sp)                   #  push &self->retval
+    sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
     BAL(.L${opcode}_continue)              #  make call; will return after
     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
     move      rINST, v0                    #  save result of inline
     move      a0, rOBJ                     #  a0<- method
     move      a1, rSELF                    #  a1<- self
-    JAL(dvmFastMethodTraceExit)            #  (method, self)
-    beqz      v0, common_exceptionThrown   #  returned false, handle exception
+    JAL(dvmFastNativeMethodTraceExit)      #  (method, self)
+    beqz      rINST, common_exceptionThrown   #  returned false, handle exception
     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
     GOTO_OPCODE(t0)                        #  jump to next instruction
diff --git a/vm/mterp/mips/OP_EXECUTE_INLINE_RANGE.S b/vm/mterp/mips/OP_EXECUTE_INLINE_RANGE.S
index 3c95a8c..fd964f7 100644
--- a/vm/mterp/mips/OP_EXECUTE_INLINE_RANGE.S
+++ b/vm/mterp/mips/OP_EXECUTE_INLINE_RANGE.S
@@ -78,7 +78,7 @@
     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
     GET_OPA(a0)                            #  a0 <- A
     # Stack should have 16/20 available
-    sw        a1, 16(sp)                   #  push &self->retval
+    sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
     move      rINST, rOBJ                  #  rINST<- method
     BAL(.L${opcode}_continue)              #  make call; will return after
     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
diff --git a/vm/mterp/mips/OP_FILLED_NEW_ARRAY_JUMBO.S b/vm/mterp/mips/OP_FILLED_NEW_ARRAY_JUMBO.S
deleted file mode 100644
index a546db2..0000000
--- a/vm/mterp/mips/OP_FILLED_NEW_ARRAY_JUMBO.S
+++ /dev/null
@@ -1,95 +0,0 @@
-%default { "isrange":"0" }
-%verify "executed"
-%verify "unimplemented array type"
-    /*
-     * Create a new array with elements filled from registers.
-     *
-     * TODO: convert most of this into a common subroutine, shared with
-     *       OP_FILLED_NEW_ARRAY.S.
-     */
-     /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
-
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    FETCH(a0, 1)                           # r0<- aaaa (lo)
-    FETCH(a1, 2)                           # r1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
-    sll       a1,a1,16
-    or        a1, a0, a1                   # a1<- AAAAaaaa
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
-    GET_OPA(rOBJ)                          #  rOBJ <- AA or BA
-    EXPORT_PC()                            #  need for resolve and alloc
-    # already resolved?
-    bnez      a0, .L${opcode}_continue     #  yes, continue on
-    LOAD_rSELF_method(a3)                  #  a3 <- self->method
-    li        a2, 0                        #  a2 <- false
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
-    move      a0, v0
-    # got null?
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-    b         .L${opcode}_continue
-%break
-
-    /*
-     * On entry:
-     *  a0 holds array class
-     *  rOBJ holds AA or BA
-     */
-.L${opcode}_continue:
-    LOAD_base_offClassObject_descriptor(a3, a0) #  a3 <- arrayClass->descriptor
-    li        a2, ALLOC_DONT_TRACK         #  a2 <- alloc flags
-    lbu       rINST, 1(a3)                 #  rINST <- descriptor[1]
-    FETCH(a1, 3)                           # a1<- BBBB (length)
-    seq       t0, rINST, 'I'               #  array of ints?
-    seq       t1, rINST, 'L'               #  array of objects?
-    or        t0, t1
-    seq       t1, rINST, '['               #  array of arrays?
-    or        t0, t1
-    move      rBIX, a1                     #  save length in rBIX
-    beqz      t0, .L${opcode}_notimpl      #  no, not handled yet
-    JAL(dvmAllocArrayByClass)              #  v0 <- call(arClass, length, flags)
-    # null return?
-    beqz      v0, common_exceptionThrown   #  alloc failed, handle exception
-
-    FETCH(a1, 4)                           #  a1 CCCC
-    sw        v0, offThread_retval(rSELF)  #  retval.l <- new array
-    sw        rINST, (offThread_retval+4)(rSELF) #  retval.h <- type
-    addu      a0, v0, offArrayObject_contents #  a0 <- newArray->contents
-    subu      rBIX, rBIX, 1                #  length--, check for neg
-    FETCH_ADVANCE_INST(5)                  #  advance to next instr, load rINST
-    bltz      rBIX, 2f                     #  was zero, bail
-
-    # copy values from registers into the array
-    # a0=array, a1=CCCC, t0=BBBB(length)
-    move      t0, rBIX
-    EAS2(a2, rFP, a1)                      #  a2 <- &fp[CCCC]
-1:
-    lw        a3, 0(a2)                    #  a3 <- *a2++
-    addu      a2, 4
-    subu      t0, t0, 1                    #  count--
-    sw        a3, (a0)                     #  *contents++ = vX
-    addu      a0, 4
-    bgez      t0, 1b
-
-2:
-    lw        a0, offThread_retval(rSELF)  #  a0 <- object
-    lw        a1, (offThread_retval+4)(rSELF) #  a1 <- type
-    seq       t1, a1, 'I'                  #  Is int array?
-    bnez      t1, 3f
-    lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
-    srl       t3, a0, GC_CARD_SHIFT
-    addu      t2, a2, t3
-    sb        a2, (t2)
-3:
-    GET_INST_OPCODE(t0)                    #  ip <- opcode from rINST
-    GOTO_OPCODE(t0)                        #  execute it
-
-
-    /*
-     * Throw an exception indicating that we have not implemented this
-     * mode of filled-new-array.
-     */
-.L${opcode}_notimpl:
-    la        a0, .LstrFilledNewArrayNotImpl
-    JAL(dvmThrowInternalError)
-    b         common_exceptionThrown
diff --git a/vm/mterp/mips/OP_IGET_BOOLEAN_JUMBO.S b/vm/mterp/mips/OP_IGET_BOOLEAN_JUMBO.S
deleted file mode 100644
index 1bb6233..0000000
--- a/vm/mterp/mips/OP_IGET_BOOLEAN_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IGET_BYTE_JUMBO.S b/vm/mterp/mips/OP_IGET_BYTE_JUMBO.S
deleted file mode 100644
index a59ee92..0000000
--- a/vm/mterp/mips/OP_IGET_BYTE_JUMBO.S
+++ /dev/null
@@ -1,3 +0,0 @@
-%verify "executed"
-%verify "negative value is sign-extended"
-%include "mips/OP_IGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IGET_CHAR_JUMBO.S b/vm/mterp/mips/OP_IGET_CHAR_JUMBO.S
deleted file mode 100644
index 408daca..0000000
--- a/vm/mterp/mips/OP_IGET_CHAR_JUMBO.S
+++ /dev/null
@@ -1,3 +0,0 @@
-%verify "executed"
-%verify "large values are not sign-extended"
-%include "mips/OP_IGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IGET_JUMBO.S b/vm/mterp/mips/OP_IGET_JUMBO.S
deleted file mode 100644
index 49920b9..0000000
--- a/vm/mterp/mips/OP_IGET_JUMBO.S
+++ /dev/null
@@ -1,55 +0,0 @@
-%default { "load":"lw", "barrier":"     # noop", "sqnum":"0" }
-%verify "executed"
-%verify "null object"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 32-bit instance field get.
-     *
-     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
-     *      iget-char/jumbo, iget-short/jumbo
-     */
-    /* exop vBBBB, vCCCC, field@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
-    sll     a2,a2,16
-    or      a1, a1, a2                     # a1<- AAAAaaaa
-    LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
-    GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
-    LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish       #  no, already resolved
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
-    b       .L${opcode}_resolved        # resolved, continue
-
-%break
-
-.L${opcode}_resolved:
-     # test results
-    move      a0, v0
-    beqz      a0,common_exceptionThrown
-    /*
-     * Currently:
-     *  v0 holds resolved field
-     *  rOBJ holds object (caller saved)
-     */
-.L${opcode}_finish:
-    #BAL(common_squeak${sqnum})
-    LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
-    # check object for null
-    beqz      rOBJ, common_errNullObject   #  object was null
-    addu      a3, a3, rOBJ                 #  form address
-    $load a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
-    $barrier                               #  acquiring load
-    FETCH(a2, 3)                           #  a2<- BBBB
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    SET_VREG(a0, a2)                       #  fp[BBBB]<- a0
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
diff --git a/vm/mterp/mips/OP_IGET_OBJECT_JUMBO.S b/vm/mterp/mips/OP_IGET_OBJECT_JUMBO.S
deleted file mode 100644
index 1bb6233..0000000
--- a/vm/mterp/mips/OP_IGET_OBJECT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IGET_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IGET_OBJECT_VOLATILE_JUMBO.S
deleted file mode 100644
index 00bab92..0000000
--- a/vm/mterp/mips/OP_IGET_OBJECT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IGET_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_IGET_SHORT_JUMBO.S b/vm/mterp/mips/OP_IGET_SHORT_JUMBO.S
deleted file mode 100644
index a59ee92..0000000
--- a/vm/mterp/mips/OP_IGET_SHORT_JUMBO.S
+++ /dev/null
@@ -1,3 +0,0 @@
-%verify "executed"
-%verify "negative value is sign-extended"
-%include "mips/OP_IGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IGET_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IGET_VOLATILE_JUMBO.S
deleted file mode 100644
index ed06737..0000000
--- a/vm/mterp/mips/OP_IGET_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IGET_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_IGET_WIDE_JUMBO.S b/vm/mterp/mips/OP_IGET_WIDE_JUMBO.S
deleted file mode 100644
index 97819a7..0000000
--- a/vm/mterp/mips/OP_IGET_WIDE_JUMBO.S
+++ /dev/null
@@ -1,57 +0,0 @@
-%default {"volatile":"0"}
-%verify "executed"
-%verify "null object"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 64-bit instance field get.
-     */
-    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
-    sll    a2,a2,16
-    or     a1, a1, a2                      # a1<- AAAAaaaa
-    LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
-    GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[CCCC], the object pointer
-    LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish       #  no, already resolved
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
-    b       .L${opcode}_resolved           # resolved, continue
-
-%break
-
-.L${opcode}_resolved:
-    # test return code
-    move      a0, v0
-    bnez      v0, .L${opcode}_finish
-    b         common_exceptionThrown
-
-    /*
-     * Currently:
-     *  a0   holds resolved field
-     *  rOBJ holds object
-     */
-.L${opcode}_finish:
-    LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
-    beqz      rOBJ, common_errNullObject   #  object was null
-    GET_OPA4(a2)                           #  a2 <- A+
-    addu      rOBJ, rOBJ, a3               #  form address
-    .if $volatile
-    vLOAD64(a0, a1, rOBJ)                  #  a0/a1 <- obj.field (64-bit align ok)
-    .else
-    LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- obj.field (64-bit align ok)
-    .endif
-    FETCH(a2, 3)                           # r2<- BBBB
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    EAS2(a3, rFP, a2)                      #  a3 <- &fp[BBBB]
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    STORE64(a0, a1, a3)                    #  fp[BBBB] <- a0/a1
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
diff --git a/vm/mterp/mips/OP_IGET_WIDE_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IGET_WIDE_VOLATILE_JUMBO.S
deleted file mode 100644
index 801aa84..0000000
--- a/vm/mterp/mips/OP_IGET_WIDE_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IGET_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/mips/OP_INSTANCE_OF_JUMBO.S b/vm/mterp/mips/OP_INSTANCE_OF_JUMBO.S
deleted file mode 100644
index c55a30c..0000000
--- a/vm/mterp/mips/OP_INSTANCE_OF_JUMBO.S
+++ /dev/null
@@ -1,96 +0,0 @@
-%verify "executed"
-%verify "null object"
-%verify "class cast exception thrown, with correct class name"
-%verify "class cast exception not thrown on same class"
-%verify "class cast exception not thrown on subclass"
-%verify "class not resolved"
-%verify "class already resolved"
-    /*
-     * Check to see if an object reference is an instance of a class.
-     *
-     * Most common situation is a non-null object, being compared against
-     * an already-resolved class.
-     *
-     * TODO: convert most of this into a common subroutine, shared with
-     *       OP_INSTANCE_OF.S.
-     */
-    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
-    FETCH(a3, 4)                           # a3<- vCCCC
-    FETCH(rOBJ, 3)                         # rOBJ<- vBBBB
-    GET_VREG(a0, a3)                       #  a0 <- vCCCC (object)
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- pDvmDex
-    # is object null?
-    beqz      a0, .L${opcode}_store        #  null obj, not an instance, store a0
-    FETCH(a1, 1)                           # r1<- aaaa (lo)
-    FETCH(a3, 2)                           # r3<- AAAA (hi)
-    LOAD_base_offDvmDex_pResClasses(a2, a2) #  a2 <- pDvmDex->pResClasses
-    sll     a3,a3,16
-    or      a3, a1, a3                     # a3<- AAAAaaaa
-
-    LOAD_eas2(a1, a2, a3)                  #  a1 <- resolved class
-    LOAD_base_offObject_clazz(a0, a0)      #  a0 <- obj->clazz
-    # have we resolved this before?
-    beqz      a1, .L${opcode}_resolve      #  not resolved, do it now
-    b       .L${opcode}_resolved           # resolved, continue
-
-%break
-
-     /*
-     * Class resolved, determine type of check necessary.  This is common.
-     *  r0 holds obj->clazz
-     *  r1 holds class resolved from AAAAAAAA
-     *  r9 holds BBBB
-     */
-
-.L${opcode}_resolved:                   #  a0=obj->clazz, a1=resolved class
-    # same class (trivial success)?
-    beq       a0, a1, .L${opcode}_trivial  #  yes, trivial finish
-    # fall through to ${opcode}_fullcheck
-
-    /*
-     * Trivial test failed, need to perform full check.  This is common.
-     *  a0 holds obj->clazz
-     *  a1 holds class resolved from AAAAAAAA
-     *  rOBJ holds BBBB
-     */
-.L${opcode}_fullcheck:
-    JAL(dvmInstanceofNonTrivial)           #  v0 <- boolean result
-    move      a0, v0
-    b         .L${opcode}_store            #  go to ${opcode}_store
-
-.L${opcode}_trivial:
-    li        a0, 1                        #  indicate success
-    # fall thru
-    /*
-     * a0   holds boolean result
-     * rOBJ holds BBBB
-     */
-.L${opcode}_store:
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    SET_VREG(a0, rOBJ)                     #  vBBBB <- a0
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
-    /*
-     * Resolution required.  This is the least-likely path.
-     *
-     *  a3   holds AAAAAAAA
-     *  rOBJ holds BBBB
-     */
-.L${opcode}_resolve:
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_rSELF_method(a0)                  #  a0 <- self->method
-    move      a1, a3                       #  a1 <- AAAAAAAA
-    li        a2, 1                        #  a2 <- true
-    LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
-    JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
-    # got null?
-    move      a1, v0                       #  a1 <- class resolved from BBB
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-    FETCH(ra, 4)                           #  a3<- vCCCC
-    move       a1, a0                       #  a1<- class resolved from AAAAAAAA
-
-    GET_VREG(a0, a3)                       #  a0 <- vCCCC (object)
-    LOAD_base_offObject_clazz(a0, a0)      #  a0 <- obj->clazz
-    b         .L${opcode}_resolved         #  pick up where we left off
-
diff --git a/vm/mterp/mips/OP_INVOKE_DIRECT_JUMBO.S b/vm/mterp/mips/OP_INVOKE_DIRECT_JUMBO.S
deleted file mode 100644
index afe70b7..0000000
--- a/vm/mterp/mips/OP_INVOKE_DIRECT_JUMBO.S
+++ /dev/null
@@ -1,43 +0,0 @@
-%default { "isrange":"0", "routine":"NoRange" }
-%verify "executed"
-%verify "unknown method"
-    /*
-     * Handle a direct method call.
-     *
-     * (We could defer the "is 'this' pointer null" test to the common
-     * method invocation code, and use a flag to indicate that static
-     * calls don't count.  If we do this as part of copying the arguments
-     * out we could avoiding loading the first arg twice.)
-     *
-     */
-     /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
-    sll     a1,a1,16
-    or      a1, a0, a1                     # a1<- AAAAaaaa
-    FETCH(rBIX, 4)                         #  rBIX <- GFED or CCCC
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
-    .if (!$isrange)
-    and       rBIX, rBIX, 15               #  rBIX <- D (or stays CCCC)
-    .endif
-    EXPORT_PC()                            #  must export for invoke
-    GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
-    # already resolved?
-    bnez      a0, 1f                       #  resolved, call the function
-
-    lw        a3, offThread_method(rSELF)  #  a3 <- self->method
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    li        a2, METHOD_DIRECT            #  resolver method type
-    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
-    move      a0, v0
-    # got null?
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-
-1:
-    bnez      rOBJ, common_invokeMethodJumbo #  a0=method, rOBJ="this"
-    b         common_errNullObject         #  yes, throw exception
-
-
-
diff --git a/vm/mterp/mips/OP_INVOKE_INTERFACE_JUMBO.S b/vm/mterp/mips/OP_INVOKE_INTERFACE_JUMBO.S
deleted file mode 100644
index b055d69..0000000
--- a/vm/mterp/mips/OP_INVOKE_INTERFACE_JUMBO.S
+++ /dev/null
@@ -1,25 +0,0 @@
-%default { "isrange":"0", "routine":"NoRange" }
-%verify "executed"
-%verify "unknown method"
-%verify "null object"
-    /*
-     * Handle an interface method call.
-     */
-    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
-    FETCH(a2, 4)                           # a2<- CCCC
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    EXPORT_PC()                            #  must export for invoke
-    sll       a1,a1,16
-    or        a1, a0, a1                   #  a1<- AAAAaaaa
-    GET_VREG(rOBJ, a2)                     #  rOBJ <- first arg ("this")
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- methodClassDex
-    LOAD_rSELF_method(a2)                  #  a2 <- method
-    # null obj?
-    beqz      rOBJ, common_errNullObject   #  yes, fail
-    LOAD_base_offObject_clazz(a0, rOBJ)      #  a0 <- thisPtr->clazz
-    JAL(dvmFindInterfaceMethodInCache)     #  v0 <- call(class, ref, method, dex)
-    move      a0, v0
-    # failed?
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-    b         common_invokeMethodJumbo #  (a0=method, rOBJ="this")
diff --git a/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_JUMBO.S b/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_JUMBO.S
deleted file mode 100644
index bd7c46d..0000000
--- a/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_INVOKE_OBJECT_INIT_RANGE.S" {"jumbo":"1", "cccc":"4"}
diff --git a/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_RANGE.S b/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_RANGE.S
index df0d6c9..705be9f 100644
--- a/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_RANGE.S
+++ b/vm/mterp/mips/OP_INVOKE_OBJECT_INIT_RANGE.S
@@ -1,4 +1,4 @@
-%default { "jumbo":"0", "cccc":"2" }
+%default { "cccc":"2" }
 %verify "executed"
 %verify "finalizable class"
     /*
@@ -40,9 +40,5 @@
      */
 .L${opcode}_debugger:
     lw      a1, offThread_mainHandlerTable(rSELF)
-    .if $jumbo
-    li      t0, OP_INVOKE_DIRECT_JUMBO
-    .else
     li      t0, OP_INVOKE_DIRECT_RANGE
-    .endif
     GOTO_OPCODE_BASE(a1, t0)            # execute it
diff --git a/vm/mterp/mips/OP_INVOKE_STATIC_JUMBO.S b/vm/mterp/mips/OP_INVOKE_STATIC_JUMBO.S
deleted file mode 100644
index 80576a2..0000000
--- a/vm/mterp/mips/OP_INVOKE_STATIC_JUMBO.S
+++ /dev/null
@@ -1,53 +0,0 @@
-%verify "executed"
-%verify "unknown method"
-    /*
-     * Handle a static method call.
-     */
-     /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
-    sll     a1,a1,16
-    or      a1, a0, a1                     # r1<- AAAAaaaa
-    li      rOBJ, 0                       #  null "this" in delay slot
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
-#if defined(WITH_JIT)
-    EAS2(rBIX, a3, a1)                     #  rBIX<- &resolved_metherToCall
-#endif
-    EXPORT_PC()                            #  must export for invoke
-    # already resolved?
-    bnez      a0, common_invokeMethodJumboNoThis #  (a0 = method)
-    b         .L${opcode}_resolve
-%break
-
-.L${opcode}_resolve:
-    LOAD_rSELF_method(a3)                  #  a3 <- self->method
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    li        a2, METHOD_STATIC            #  resolver method type
-    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
-    move      a0, v0
-#if defined(WITH_JIT)
-    /*
-     * Check to see if we're actively building a trace.  If so,
-     * we need to keep this instruction out of it.
-     * rBIX: &resolved_methodToCall
-     */
-    lhu        a2, offThread_subMode(rSELF)
-    beqz      v0, common_exceptionThrown   #  null, handle exception
-    and       a2, kSubModeJitTraceBuild    #  trace under construction?
-    beqz      a2, common_invokeMethodJumboNoThis #  no, (a0=method, rOBJ="this")
-    lw        a1, 0(rBIX)                  #  reload resolved method
-    # finished resloving?
-    bnez      a1, common_invokeMethodJumboNoThis #  yes, (a0=method, rOBJ="this")
-    move      rBIX, a0                     #  preserve method
-    move      a0, rSELF
-    move      a1, rPC
-    JAL(dvmJitEndTraceSelect)              #  (self, pc)
-    move      a0, rBIX
-    b         common_invokeMethodJumboNoThis #  whew, finally!
-#else
-    # got null?
-    bnez      v0, common_invokeMethodJumboNoThis #  (a0=method, rOBJ="this")
-    b         common_exceptionThrown       #  yes, handle exception
-#endif
diff --git a/vm/mterp/mips/OP_INVOKE_SUPER_JUMBO.S b/vm/mterp/mips/OP_INVOKE_SUPER_JUMBO.S
deleted file mode 100644
index 5794cb1..0000000
--- a/vm/mterp/mips/OP_INVOKE_SUPER_JUMBO.S
+++ /dev/null
@@ -1,56 +0,0 @@
-%verify "executed"
-%verify "unknown method"
-    /*
-     * Handle a "super" method call.
-    */
-    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
-    FETCH(t0, 4)                           # t0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
-    sll       a1,a1,16
-    or        a1, a0, a1                   # a1<- AAAAaaaa
-    GET_VREG(rOBJ, t0)                     #  rOBJ <- "this" ptr
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
-    # null "this"?
-    LOAD_rSELF_method(t1)                  #  t1 <- current method
-    beqz      rOBJ, common_errNullObject   #  null "this", throw exception
-    # cmp a0, 0; already resolved?
-    LOAD_base_offMethod_clazz(rBIX, t1)    #  rBIX <- method->clazz
-    EXPORT_PC()                            #  must export for invoke
-    bnez      a0, .L${opcode}_continue     #  resolved, continue on
-
-    move      a0, rBIX                     #  a0 <- method->clazz
-    li        a2, METHOD_VIRTUAL           #  resolver method type
-    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
-    move      a0, v0
-    # got null?
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-    b         .L${opcode}_continue
-%break
-
-    /*
-     * At this point:
-     *  a0 = resolved base method
-     *  rBIX = method->clazz
-     */
-.L${opcode}_continue:
-    LOAD_base_offClassObject_super(a1, rBIX) #  a1 <- method->clazz->super
-    LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
-    LOAD_base_offClassObject_vtableCount(a3, a1) #  a3 <- super->vtableCount
-    EXPORT_PC()                            #  must export for invoke
-    # compare (methodIndex, vtableCount)
-    bgeu      a2, a3, .L${opcode}_nsm      #  method not present in superclass
-    LOAD_base_offClassObject_vtable(a1, a1) #  a1 <- ...clazz->super->vtable
-    LOAD_eas2(a0, a1, a2)                  #  a0 <- vtable[methodIndex]
-    b         common_invokeMethodJumbo     #  a0=method rOBJ="this"
-
-    /*
-     * Throw a NoSuchMethodError with the method name as the message.
-     *  a0 = resolved base method
-     */
-.L${opcode}_nsm:
-    LOAD_base_offMethod_name(a1, a0)       #  a1 <- method name
-    b         common_errNoSuchMethod
-
diff --git a/vm/mterp/mips/OP_INVOKE_VIRTUAL_JUMBO.S b/vm/mterp/mips/OP_INVOKE_VIRTUAL_JUMBO.S
deleted file mode 100644
index 6bcde34..0000000
--- a/vm/mterp/mips/OP_INVOKE_VIRTUAL_JUMBO.S
+++ /dev/null
@@ -1,44 +0,0 @@
-%verify "executed"
-%verify "unknown method"
-%verify "null object"
-    /*
-     * Handle a virtual method call.
-     */
-     /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
-    sll     a1,a1,16
-    or      a1, a0, a1                     # a1<- AAAAaaaa
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
-    EXPORT_PC()                            #  must export for invoke
-    # already resolved?
-    bnez      a0, .L${opcode}_continue     #  yes, continue on
-
-    LOAD_rSELF_method(a3)                  #  a3 <- self->method
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    li        a2, METHOD_VIRTUAL           #  resolver method type
-    JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
-    move      a0, v0
-    # got null?
-    bnez      v0, .L${opcode}_continue     #  no, continue
-    b         common_exceptionThrown       #  yes, handle exception
-%break
-
-    /*
-     * At this point:
-     *  a0 = resolved base method
-     *  rBIX= C or CCCC (index of first arg, which is the "this" ptr)
-     */
-.L${opcode}_continue:
-    FETCH(rBIX,4)                          #  rBIX <- CCCC
-    GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
-    LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
-    # is "this" null?
-    beqz      rOBJ, common_errNullObject   #  null "this", throw exception
-    LOAD_base_offObject_clazz(a3, rOBJ)    #  a3 <- thisPtr->clazz
-    LOAD_base_offClassObject_vtable(a3, a3) #  a3 <- thisPtr->clazz->vtable
-    LOAD_eas2(a0, a3, a2)                  #  a0 <- vtable[methodIndex]
-    b         common_invokeMethodJumbo     #  (a0=method, rOBJ="this")
-
diff --git a/vm/mterp/mips/OP_IPUT_BOOLEAN_JUMBO.S b/vm/mterp/mips/OP_IPUT_BOOLEAN_JUMBO.S
deleted file mode 100644
index 8457c29..0000000
--- a/vm/mterp/mips/OP_IPUT_BOOLEAN_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IPUT_BYTE_JUMBO.S b/vm/mterp/mips/OP_IPUT_BYTE_JUMBO.S
deleted file mode 100644
index 8457c29..0000000
--- a/vm/mterp/mips/OP_IPUT_BYTE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IPUT_CHAR_JUMBO.S b/vm/mterp/mips/OP_IPUT_CHAR_JUMBO.S
deleted file mode 100644
index 8457c29..0000000
--- a/vm/mterp/mips/OP_IPUT_CHAR_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IPUT_JUMBO.S b/vm/mterp/mips/OP_IPUT_JUMBO.S
deleted file mode 100644
index 2d05984..0000000
--- a/vm/mterp/mips/OP_IPUT_JUMBO.S
+++ /dev/null
@@ -1,58 +0,0 @@
-%default { "store":"sw","postbarrier":"# noop ", "prebarrier":"    #  noop", "sqnum":"0" }
-%verify "executed"
-%verify "null object"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 32-bit instance field put.
-     *
-     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
-     *      iput-short/jumbo
-     */
-    /* exop vBBBB, vCCCC, field@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
-    sll       a2,a2,16
-    or        a1, a1, a2                   #  a1<- AAAAaaaa
-    LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
-    GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
-    LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish       #  no, already resolved
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
-    b       .L${opcode}_resolved           # resolved, continue
-
-%break
-
-.L${opcode}_resolved:
-    move      a0, v0
-    beqz      a0, common_exceptionThrown
-    # fall through to ${opcode}_finish
-
-
-    /*
-     * Currently:
-     *  a0 holds resolved field
-     *  rOBJ holds object
-     */
-.L${opcode}_finish:
-    #BAL(common_squeak${sqnum})
-    LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
-    FETCH(a1, 3)                           # a1<- BBBB
-    GET_VREG(a0, a1)                       #  a0 <- fp[BBBB]
-    # check object for null
-    beqz      rOBJ, common_errNullObject   #  object was null
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    addu      rOBJ, rOBJ, a3               #  form address
-    $prebarrier                            #  releasing store
-    $store a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
-    $postbarrier
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
diff --git a/vm/mterp/mips/OP_IPUT_OBJECT_JUMBO.S b/vm/mterp/mips/OP_IPUT_OBJECT_JUMBO.S
deleted file mode 100644
index ce82ff8..0000000
--- a/vm/mterp/mips/OP_IPUT_OBJECT_JUMBO.S
+++ /dev/null
@@ -1,60 +0,0 @@
-%default { "store":"sw", "postbarrier":"    #  noop", "prebarrier":"    #  noop", "sqnum":"0" }
-%verify "executed"
-%verify "null object"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 32-bit instance field put.
-     */
-    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
-    sll      a1,a1,16
-    or       a1, a1, a2                    # a1<- AAAAaaaa
-    LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
-    GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
-    LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish       #  no, already resolved
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
-    b         .L${opcode}_resolved
-
-%break
-
-    /*
-     * Currently:
-     *  a0 holds resolved field
-     *  rOBJ holds object
-     */
-.L${opcode}_resolved:
-    move      a0, v0
-    beqz      a0, common_exceptionThrown
-    # fall through to ${opcode}_finish
-
-.L${opcode}_finish:
-    #BAL(common_squeak${sqnum})
-    LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
-    FETCH(a1, 3)                              # a1<- BBBB
-    GET_VREG(a0, a1)                       #  a0 <- fp[BBBB]
-    lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
-    # check object for null
-    beqz      rOBJ, common_errNullObject   #  object was null
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    addu      t2, rOBJ, a3                 #  form address
-    $prebarrier                            #  releasing store
-    $store a0, (t2)                        #  obj.field (32 bits) <- a0
-    $postbarrier
-    beqz      a0, 1f                       #  stored a null reference?
-    srl       t1, rOBJ, GC_CARD_SHIFT
-    addu      t2, a2, t1
-    sb        a2, (t2)                     #  mark card if not
-1:
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
diff --git a/vm/mterp/mips/OP_IPUT_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IPUT_OBJECT_VOLATILE_JUMBO.S
deleted file mode 100644
index 48cdb6c..0000000
--- a/vm/mterp/mips/OP_IPUT_OBJECT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_OBJECT_JUMBO.S" {"prebarrier":"SMP_DMB_ST", "postbarrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_IPUT_SHORT_JUMBO.S b/vm/mterp/mips/OP_IPUT_SHORT_JUMBO.S
deleted file mode 100644
index 8457c29..0000000
--- a/vm/mterp/mips/OP_IPUT_SHORT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_IPUT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IPUT_VOLATILE_JUMBO.S
deleted file mode 100644
index aaf70b7..0000000
--- a/vm/mterp/mips/OP_IPUT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_JUMBO.S" {"prebarrier":"SMP_DMB_ST", "postbarrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_IPUT_WIDE_JUMBO.S b/vm/mterp/mips/OP_IPUT_WIDE_JUMBO.S
deleted file mode 100644
index 8edc142..0000000
--- a/vm/mterp/mips/OP_IPUT_WIDE_JUMBO.S
+++ /dev/null
@@ -1,55 +0,0 @@
-%default {"volatile":"0"}
-%verify "executed"
-%verify "null object"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- CCCC
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
-    sll       a2,a2,16
-    or        a1, a1, a2                   # a1<- AAAAaaaa
-
-    LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
-    GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
-    LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish       #  no, already resolved
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
-    b       .L${opcode}_resolved           # resolved, continue
-
-%break
-
-.L${opcode}_resolved:
-    move      a0, v0
-    beqz      a0, common_exceptionThrown
-    # fall through to ${opcode}_finish
-    /*
-     * Currently:
-     *  a0   holds resolved field
-     *  rOBJ holds object
-     */
-.L${opcode}_finish:
-    FETCH(a2, 3)                           # a1<- BBBB
-    LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
-    EAS2(a2, rFP, a2)                      #  a2 <- &fp[BBBB]
-    # check object for null
-    beqz      rOBJ, common_errNullObject   #  object was null
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    LOAD64(a0, a1, a2)                     #  a0/a1 <- fp[BBBB]
-    GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
-    addu      a2, rOBJ, a3                 #  form address
-    .if $volatile
-    JAL(dvmQuasiAtomicSwap64Sync)          # stores r0/r1 into addr r2
-#    STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
-    .else
-    STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
-    .endif
-    GOTO_OPCODE(rBIX)                      #  jump to next instruction
-
-
diff --git a/vm/mterp/mips/OP_IPUT_WIDE_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_IPUT_WIDE_VOLATILE_JUMBO.S
deleted file mode 100644
index 72436fa..0000000
--- a/vm/mterp/mips/OP_IPUT_WIDE_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_IPUT_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/mips/OP_NEW_ARRAY_JUMBO.S b/vm/mterp/mips/OP_NEW_ARRAY_JUMBO.S
deleted file mode 100644
index 6761505..0000000
--- a/vm/mterp/mips/OP_NEW_ARRAY_JUMBO.S
+++ /dev/null
@@ -1,69 +0,0 @@
-%verify "executed"
-%verify "negative array length"
-%verify "allocation fails"
-    /*
-     * Allocate an array of objects, specified with the array class
-     * and a count.
-     *
-     * The verifier guarantees that this is an array class, so we don't
-     * check for it here.
-     */
-    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
-    FETCH(a2, 1)                           # a2<- aaaa (lo)
-    FETCH(a3, 2)                           # a3<- AAAA (hi)
-    FETCH(a0, 4)                           # a0<- vCCCC
-    sll     a3,a3,16                       #
-    or      a2, a2, a3                     # a2<- AAAAaaaa
-
-    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
-    GET_VREG(a1, a0)                       #  a1 <- vCCCC (array length)
-    LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
-    LOAD_eas2(a0, a3, a2)                  #  a0 <- resolved class
-    # check length
-    bltz      a1, common_errNegativeArraySize #  negative length, bail - len in a1
-    EXPORT_PC()                            #  req'd for resolve, alloc
-    # already resolved?
-    beqz      a0, .L${opcode}_resolve      #  not resolved,
-    b         .L${opcode}_finish
-%break
-
-    /*
-     * Finish allocation.
-     *
-     *  a0 holds class
-     *  a1 holds array length
-     */
-.L${opcode}_finish:
-    li        a2, ALLOC_DONT_TRACK         #  don't track in local refs table
-    JAL(dvmAllocArrayByClass)              #  v0 <- call(clazz, length, flags)
-    FETCH(a2, 3)                           # r2<- vBBBB
-    # failed?
-    beqz      v0, common_exceptionThrown   #  yes, handle the exception
-    FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    SET_VREG(v0, a2)                       #  vBBBB <- v0
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-#%break
-
-
-
-    /*
-     * Resolve class.  (This is an uncommon case.)
-     *
-     *  a1 holds array length
-     *  a2 holds class ref AAAAAAAA
-     */
-.L${opcode}_resolve:
-    LOAD_rSELF_method(a3)                  #  a3 <- self->method
-    move      rOBJ, a1                     #  rOBJ <- length (save)
-    move      a1, a2                       #  a1 <- AAAAAAAA
-    li        a2, 0                        #  a2 <- false
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
-    move      a1, rOBJ                     #  a1 <- length (restore)
-    # got null?
-    beqz      v0, common_exceptionThrown   #  yes, handle exception
-    move      a0, v0
-    b         .L${opcode}_finish           #  continue with to ${opcode}_finish
-
-
diff --git a/vm/mterp/mips/OP_NEW_INSTANCE_JUMBO.S b/vm/mterp/mips/OP_NEW_INSTANCE_JUMBO.S
deleted file mode 100644
index a00991e..0000000
--- a/vm/mterp/mips/OP_NEW_INSTANCE_JUMBO.S
+++ /dev/null
@@ -1,108 +0,0 @@
-%verify "executed"
-%verify "class not resolved"
-%verify "class cannot be resolved"
-%verify "class not initialized"
-%verify "class fails to initialize"
-%verify "class already resolved/initialized"
-%verify "class is abstract or interface"
-%verify "allocation fails"
-    /*
-     * Create a new instance of a class.
-     */
-    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
-    FETCH(a0, 1)                            # a0<- aaaa (lo)DvmDex
-    FETCH(a1, 2)                            # a1<- AAAA (hi)BBB
-    LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
-    sll      a1,a1,16
-    or       a1, a0, a1                    # a1<- AAAAaaaa
-    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
-#if defined(WITH_JIT)
-    EAS2(rBIX, a3, a1)                     #  rBIX <- &resolved_class
-#endif
-    EXPORT_PC()                            #  req'd for init, resolve, alloc
-    # already resolved?
-    beqz      a0, .L${opcode}_resolve      #  no, resolve it now
-.L${opcode}_resolved:                   #  a0=class
-    lbu       a1, offClassObject_status(a0) #  a1 <- ClassStatus enum
-    # has class been initialized?
-    li        t0, CLASS_INITIALIZED
-    move      rOBJ, a0                     #  save a0
-    bne       a1, t0, .L${opcode}_needinit #  no, init class now
-
-.L${opcode}_initialized:                #  a0=class
-    LOAD_base_offClassObject_accessFlags(a3, a0) #  a3 <- clazz->accessFlags
-    li        a1, ALLOC_DONT_TRACK         #  flags for alloc call
-    # a0=class
-    JAL(dvmAllocObject)                    #  v0 <- new object
-    FETCH(a3, 3)                           # a3<- BBBB
-#if defined(WITH_JIT)
-    /*
-     * The JIT needs the class to be fully resolved before it can
-     * include this instruction in a trace.
-     */
-    lhu       a1, offThread_subMode(rSELF)
-    beqz      v0, common_exceptionThrown   #  yes, handle the exception
-    and       a1, kSubModeJitTraceBuild    #  under construction?
-    bnez      a1, .L${opcode}_jitCheck
-#else
-    # failed?
-    beqz      v0, common_exceptionThrown   #  yes, handle the exception
-#endif
-    b         .L${opcode}_continue
-
-%break
-
-.L${opcode}_continue:
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    SET_VREG(v0, a3)                       #  vBBBB <- v0
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-
-#if defined(WITH_JIT)
-    /*
-     * Check to see if we need to stop the trace building early.
-     * v0: new object
-     * a3: vAA
-     */
-.L${opcode}_jitCheck:
-    lw        a1, 0(rBIX)                  #  reload resolved class
-    # okay?
-    bnez      a1, .L${opcode}_continue     #  yes, finish
-    move      rOBJ, v0                     #  preserve new object
-    move      rBIX, a3                     #  preserve vAA
-    move      a0, rSELF
-    move      a1, rPC
-    JAL(dvmJitEndTraceSelect)              #  (self, pc)
-    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    SET_VREG(rOBJ, rBIX)                   #  vAA <- new object
-    GOTO_OPCODE(t0)                        #  jump to next instruction
-#endif
-
-    /*
-     * Class initialization required.
-     *
-     *  a0 holds class object
-     */
-.L${opcode}_needinit:
-    JAL(dvmInitClass)                      #  initialize class
-    move      a0, rOBJ                     #  restore a0
-    # check boolean result
-    bnez      v0, .L${opcode}_initialized  #  success, continue
-    b         common_exceptionThrown       #  failed, deal with init exception
-
-
-    /*
-     * Resolution required.  This is the least-likely path.
-     *
-     *  a1 holds AAAAAAAA
-     */
-.L${opcode}_resolve:
-    LOAD_rSELF_method(a3)                  #  a3 <- self->method
-    li        a2, 0                        #  a2 <- false
-    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
-    JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
-    move      a0, v0
-    # got null?
-    bnez      v0, .L${opcode}_resolved     #  no, continue
-    b         common_exceptionThrown       #  yes, handle exception
diff --git a/vm/mterp/mips/OP_SGET_BOOLEAN_JUMBO.S b/vm/mterp/mips/OP_SGET_BOOLEAN_JUMBO.S
deleted file mode 100644
index 2a787a2..0000000
--- a/vm/mterp/mips/OP_SGET_BOOLEAN_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SGET_BYTE_JUMBO.S b/vm/mterp/mips/OP_SGET_BYTE_JUMBO.S
deleted file mode 100644
index 2a787a2..0000000
--- a/vm/mterp/mips/OP_SGET_BYTE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SGET_CHAR_JUMBO.S b/vm/mterp/mips/OP_SGET_CHAR_JUMBO.S
deleted file mode 100644
index 2a787a2..0000000
--- a/vm/mterp/mips/OP_SGET_CHAR_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SGET_JUMBO.S b/vm/mterp/mips/OP_SGET_JUMBO.S
deleted file mode 100644
index 93e7586..0000000
--- a/vm/mterp/mips/OP_SGET_JUMBO.S
+++ /dev/null
@@ -1,54 +0,0 @@
-%default { "barrier":"                  #  no-op " }
-%verify "executed"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-     /*
-     * Jumbo 32-bit SGET handler.
-     *
-     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
-     *      sget-char/jumbo, sget-short/jumbo
-     */
-     /* exop vBBBB, field@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
-    sll       a1,a1,16
-    or        a1, a0, a1                   # a1<- AAAAaaaa
-    LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
-    # is resolved entry !null?
-    bnez      a0, .L${opcode}_finish
-
-    /*
-     * Continuation if the field has not yet been resolved.
-     *  a1:  AAAAAAAA field ref
-     *  rBIX: dvmDex->pResFields
-     */
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-#if defined(WITH_JIT)
-    EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
-#endif
-    EXPORT_PC()                            #  resolve() could throw, so export now
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
-    move      a0, v0
-    # success?
-    beqz      v0, common_exceptionThrown   #  no, handle exception
-#if defined(WITH_JIT)
-    /*
-     * If the JIT is actively building a trace we need to make sure
-     * that the field is fully resolved before including this instruction.
-     */
-    JAL(common_verifyField)
-#endif
-    b        .L${opcode}_finish            # resume
-%break
-
-.L${opcode}_finish:
-    LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
-    $barrier                               #  acquiring load
-    FETCH(a2, 3)                           # r2<- BBBB
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    SET_VREG_GOTO(a1, a2, t0)              #  fp[BBBB] <- a1
diff --git a/vm/mterp/mips/OP_SGET_OBJECT_JUMBO.S b/vm/mterp/mips/OP_SGET_OBJECT_JUMBO.S
deleted file mode 100644
index 2a787a2..0000000
--- a/vm/mterp/mips/OP_SGET_OBJECT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SGET_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SGET_OBJECT_VOLATILE_JUMBO.S
deleted file mode 100644
index c9975c8..0000000
--- a/vm/mterp/mips/OP_SGET_OBJECT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_OBJECT_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_SGET_SHORT_JUMBO.S b/vm/mterp/mips/OP_SGET_SHORT_JUMBO.S
deleted file mode 100644
index 2a787a2..0000000
--- a/vm/mterp/mips/OP_SGET_SHORT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SGET_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SGET_VOLATILE_JUMBO.S
deleted file mode 100644
index 93a5f41..0000000
--- a/vm/mterp/mips/OP_SGET_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_JUMBO.S" {"barrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_SGET_WIDE_JUMBO.S b/vm/mterp/mips/OP_SGET_WIDE_JUMBO.S
deleted file mode 100644
index 7a52889..0000000
--- a/vm/mterp/mips/OP_SGET_WIDE_JUMBO.S
+++ /dev/null
@@ -1,47 +0,0 @@
-%default {"volatile":"0"}
-%verify "executed"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 64-bit SGET handler.
-     */
-    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResFields(a2, a2) #  a2 <- dvmDex->pResFields
-    sll       a1,a1,16
-    or        a1, a0, a1                 # a1<- AAAAaaaa
-    LOAD_eas2(a0, a2, a1)                #  a0 <- resolved StaticField ptr
-    # is resolved entry null?
-    bnez      a0, .L${opcode}_finish
-
-    /*
-     * Continuation if the field has not yet been resolved.
-     *  a1:  AAAAAAAA field ref
-     *
-     * Returns StaticField pointer in v0.
-     */
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-    EXPORT_PC()                            #  resolve() could throw, so export now
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveStaticField)             #  a0 <- resolved StaticField ptr
-    move      a0, v0
-    # success?
-    beqz      v0, common_exceptionThrown   #  no, handle exception
-    b        .L${opcode}_finish            # resume
-%break
-
-.L${opcode}_finish:
-    FETCH(a1, 3)                           # a1<- BBBB
-    .if $volatile
-    vLOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
-    .else
-    LOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
-    .endif
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    EAS2(a1, rFP, a1)                      #  a1 <- &fp[BBBB]
-    STORE64(a2, a3, a1)                    #  vBBBB/vBBBB+1 <- a2/a3
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    GOTO_OPCODE(t0)                        #  jump to next instruction
diff --git a/vm/mterp/mips/OP_SGET_WIDE_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SGET_WIDE_VOLATILE_JUMBO.S
deleted file mode 100644
index c6039c3..0000000
--- a/vm/mterp/mips/OP_SGET_WIDE_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SGET_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/mips/OP_SPUT_BOOLEAN_JUMBO.S b/vm/mterp/mips/OP_SPUT_BOOLEAN_JUMBO.S
deleted file mode 100644
index e183701..0000000
--- a/vm/mterp/mips/OP_SPUT_BOOLEAN_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SPUT_BYTE_JUMBO.S b/vm/mterp/mips/OP_SPUT_BYTE_JUMBO.S
deleted file mode 100644
index e183701..0000000
--- a/vm/mterp/mips/OP_SPUT_BYTE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SPUT_CHAR_JUMBO.S b/vm/mterp/mips/OP_SPUT_CHAR_JUMBO.S
deleted file mode 100644
index e183701..0000000
--- a/vm/mterp/mips/OP_SPUT_CHAR_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SPUT_JUMBO.S b/vm/mterp/mips/OP_SPUT_JUMBO.S
deleted file mode 100644
index 5a4f824..0000000
--- a/vm/mterp/mips/OP_SPUT_JUMBO.S
+++ /dev/null
@@ -1,55 +0,0 @@
-%default { "postbarrier":"      #  no-op ", "prebarrier":"      #  no-op " }
-%verify "executed"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 32-bit SPUT handler.
-     *
-     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
-     *      sput-short/jumbo
-     */
-    /* exop vBBBB, field@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
-    sll       a1,a1,16
-    or        a1, a0, a1                   # a1<- AAAAaaaa
-    LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
-    bnez      a0, .L${opcode}_finish       #  is resolved entry null?
-
-    /*
-     * Continuation if the field has not yet been resolved.
-     *  a1:  AAAAAAAA field ref
-     *  rBIX: dvmDex->pResFields
-     */
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-#if defined(WITH_JIT)
-    EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
-#endif
-    EXPORT_PC()                            #  resolve() may throw, so export now
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
-    move      a0, v0
-    beqz      v0, common_exceptionThrown   #  success? no, handle exception
-#if defined(WITH_JIT)
-    /*
-     * If the JIT is actively building a trace we need to make sure
-     * that the field is fully resolved before including this instruction.
-     */
-    JAL(common_verifyField)
-#endif
-    b        .L${opcode}_finish            # resume
-%break
-
-.L${opcode}_finish:
-    # field ptr in a0
-    FETCH(a2, 3)                           # a2<- BBBB
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    GET_VREG(a1, a2)                       #  a1 <- fp[BBBB]
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    $prebarrier                            #  releasing store
-    sw        a1, offStaticField_value(a0) #  field <- vBBBB
-    $postbarrier
-    GOTO_OPCODE(t0)                        #  jump to next instruction
diff --git a/vm/mterp/mips/OP_SPUT_OBJECT_JUMBO.S b/vm/mterp/mips/OP_SPUT_OBJECT_JUMBO.S
deleted file mode 100644
index 22fa450..0000000
--- a/vm/mterp/mips/OP_SPUT_OBJECT_JUMBO.S
+++ /dev/null
@@ -1,58 +0,0 @@
-%default { "postbarrier":"      #  no-op ", "prebarrier":"      #  no-op " }
-%verify "executed"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 32-bit SPUT handler for objects
-     */
-    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
-    FETCH(a0, 1)                           # a0<- aaaa (lo)
-    FETCH(a1, 2)                           # a1<- AAAA (hi)
-    LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
-    sll     a1,a1,16
-    or      a1,a0,a1                       # a1<- AAAAaaaa
-
-    LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
-    bnez      a0, .L${opcode}_finish       #  is resolved entry null?
-
-    /* Continuation if the field has not yet been resolved.
-     * a1:  BBBB field ref
-     * rBIX: dvmDex->pResFields
-     */
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-#if defined(WITH_JIT)
-    EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
-#endif
-    EXPORT_PC()                            #  resolve() may throw, so export now
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
-    move      a0, v0
-    beqz      v0, common_exceptionThrown   #  success? no, handle exception
-#if defined(WITH_JIT)
-    /*
-     * If the JIT is actively building a trace we need to make sure
-     * that the field is fully resolved before including this instruction.
-     */
-    JAL(common_verifyField)
-#endif
-    b         .L${opcode}_finish           #  resume
-
-%break
-.L${opcode}_finish:                     #  field ptr in a0
-    FETCH(a2, 3)                        # a2<- BBBB
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    GET_VREG(a1, a2)                       #  a1 <- fp[BBBB]
-    lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
-    lw        t1, offField_clazz(a0)       #  t1 <- field->clazz
-    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
-    $prebarrier                            #  releasing store
-    sw        a1, offStaticField_value(a0) #  field <- vBBBB
-    $postbarrier
-    beqz      a1, 1f
-    srl       t2, t1, GC_CARD_SHIFT
-    addu      t3, a2, t2
-    sb        a2, (t3)
-    1:
-    GOTO_OPCODE(t0)                        #  jump to next instruction
diff --git a/vm/mterp/mips/OP_SPUT_OBJECT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SPUT_OBJECT_VOLATILE_JUMBO.S
deleted file mode 100644
index fd22e6e..0000000
--- a/vm/mterp/mips/OP_SPUT_OBJECT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_OBJECT_JUMBO.S" {"prebarrier":"SMP_DMB_ST", "postbarrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_SPUT_SHORT_JUMBO.S b/vm/mterp/mips/OP_SPUT_SHORT_JUMBO.S
deleted file mode 100644
index e183701..0000000
--- a/vm/mterp/mips/OP_SPUT_SHORT_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_JUMBO.S"
diff --git a/vm/mterp/mips/OP_SPUT_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SPUT_VOLATILE_JUMBO.S
deleted file mode 100644
index 7c8e2f4..0000000
--- a/vm/mterp/mips/OP_SPUT_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_JUMBO.S" {"prebarrier":"SMP_DMB_ST", "postbarrier":"SMP_DMB"}
diff --git a/vm/mterp/mips/OP_SPUT_WIDE_JUMBO.S b/vm/mterp/mips/OP_SPUT_WIDE_JUMBO.S
deleted file mode 100644
index b12ac62..0000000
--- a/vm/mterp/mips/OP_SPUT_WIDE_JUMBO.S
+++ /dev/null
@@ -1,60 +0,0 @@
-%default {"volatile":"0"}
-%verify "executed"
-%verify "field already resolved"
-%verify "field not yet resolved"
-%verify "field cannot be resolved"
-    /*
-     * Jumbo 64-bit SPUT handler.
-     */
-    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
-    LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
-    sll     a2,a2,16
-    or      a1, a1, a2                    # a1<- AAAAaaaa
-    FETCH(rOBJ, 3)                        # rOBJ<- BBBB    solved StaticField ptr
-    EAS2(rOBJ, rFP, t0)                    #  rOBJ<- &fp[BBBB]
-    # is resolved entry null?
-    beqz      a2, .L${opcode}_resolve      #  yes, do resolve
-.L${opcode}_finish:                        #  field ptr in a2, BBBB in rOBJ
-    FETCH_ADVANCE_INST(4)                  #  advance rPC, load rINST
-    LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- vBBBB/vBBBB+1
-    GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
-    .if $volatile
-    addu    a2, offStaticField_value       #  a2<- pointer to data
-    JAL(dvmQuasiAtomicSwap64Sync)          #  stores a0/a1 into addr a2
-    .else
-    STORE64_off(a0, a1, a2, offStaticField_value) #  field <- vBBBB/vBBBB+1
-    .endif
-    GOTO_OPCODE(rBIX)                      #  jump to next instruction
-%break
-
-    /*
-     * Continuation if the field has not yet been resolved.
-     *  a1:  AAAAAAAA field ref
-     *  rOBJ:  &fp[BBBB]
-     *  rBIX: dvmDex->pResFields
-     *
-     * Returns StaticField pointer in a2.
-     */
-.L${opcode}_resolve:
-    LOAD_rSELF_method(a2)                  #  a2 <- current method
-#if defined(WITH_JIT)
-    EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
-#endif
-    EXPORT_PC()                            #  resolve() could throw, so export now
-    LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
-    JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
-    # success ?
-    move      a0, v0
-    beqz      v0, common_exceptionThrown   #  no, handle exception
-#if defined(WITH_JIT)
-    /*
-     * If the JIT is actively building a trace we need to make sure
-     * that the field is fully resolved before including this instruction.
-     */
-    JAL(common_verifyField)
-#endif
-    move      a2, v0
-    b         .L${opcode}_finish           # resume
diff --git a/vm/mterp/mips/OP_SPUT_WIDE_VOLATILE_JUMBO.S b/vm/mterp/mips/OP_SPUT_WIDE_VOLATILE_JUMBO.S
deleted file mode 100644
index 6dc59e5..0000000
--- a/vm/mterp/mips/OP_SPUT_WIDE_VOLATILE_JUMBO.S
+++ /dev/null
@@ -1,2 +0,0 @@
-%verify "executed"
-%include "mips/OP_SPUT_WIDE_JUMBO.S" {"volatile":"1"}
diff --git a/vm/mterp/mips/OP_THROW_VERIFICATION_ERROR_JUMBO.S b/vm/mterp/mips/OP_THROW_VERIFICATION_ERROR_JUMBO.S
deleted file mode 100644
index dbddc42..0000000
--- a/vm/mterp/mips/OP_THROW_VERIFICATION_ERROR_JUMBO.S
+++ /dev/null
@@ -1,17 +0,0 @@
-%verify executed
-    /*
-     * Handle a jumbo throw-verification-error instruction.  This throws an
-     * exception for an error discovered during verification.  The
-     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
-     */
-     /* exop BBBB, Class@AAAAAAAA */
-    FETCH(a1, 1)                           # a1<- aaaa (lo)
-    FETCH(a2, 2)                           # a2<- AAAA (hi)
-    LOAD_rSELF_method(a0)                  #  a0 <- self->method
-    sll    a2,a2,16
-    or     a2, a1, a2                      # a2<- AAAAaaaa
-    EXPORT_PC()                            #  export the PC
-    FETCH(a1, 3)                           # a1<- BBBB
-    JAL(dvmThrowVerificationError)         #  always throws
-    b         common_exceptionThrown       #  handle exception
-
diff --git a/vm/mterp/mips/OP_UNUSED_27FF.S b/vm/mterp/mips/OP_UNUSED_27FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_27FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_28FF.S b/vm/mterp/mips/OP_UNUSED_28FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_28FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_29FF.S b/vm/mterp/mips/OP_UNUSED_29FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_29FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2AFF.S b/vm/mterp/mips/OP_UNUSED_2AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2BFF.S b/vm/mterp/mips/OP_UNUSED_2BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2CFF.S b/vm/mterp/mips/OP_UNUSED_2CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2DFF.S b/vm/mterp/mips/OP_UNUSED_2DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2EFF.S b/vm/mterp/mips/OP_UNUSED_2EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_2FFF.S b/vm/mterp/mips/OP_UNUSED_2FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_2FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_30FF.S b/vm/mterp/mips/OP_UNUSED_30FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_30FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_31FF.S b/vm/mterp/mips/OP_UNUSED_31FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_31FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_32FF.S b/vm/mterp/mips/OP_UNUSED_32FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_32FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_33FF.S b/vm/mterp/mips/OP_UNUSED_33FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_33FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_34FF.S b/vm/mterp/mips/OP_UNUSED_34FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_34FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_35FF.S b/vm/mterp/mips/OP_UNUSED_35FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_35FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_36FF.S b/vm/mterp/mips/OP_UNUSED_36FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_36FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_37FF.S b/vm/mterp/mips/OP_UNUSED_37FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_37FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_38FF.S b/vm/mterp/mips/OP_UNUSED_38FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_38FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_39FF.S b/vm/mterp/mips/OP_UNUSED_39FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_39FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3AFF.S b/vm/mterp/mips/OP_UNUSED_3AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3BFF.S b/vm/mterp/mips/OP_UNUSED_3BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3CFF.S b/vm/mterp/mips/OP_UNUSED_3CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3DFF.S b/vm/mterp/mips/OP_UNUSED_3DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3EFF.S b/vm/mterp/mips/OP_UNUSED_3EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_3FFF.S b/vm/mterp/mips/OP_UNUSED_3FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_3FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_40FF.S b/vm/mterp/mips/OP_UNUSED_40FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_40FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_41FF.S b/vm/mterp/mips/OP_UNUSED_41FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_41FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_42FF.S b/vm/mterp/mips/OP_UNUSED_42FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_42FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_43FF.S b/vm/mterp/mips/OP_UNUSED_43FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_43FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_44FF.S b/vm/mterp/mips/OP_UNUSED_44FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_44FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_45FF.S b/vm/mterp/mips/OP_UNUSED_45FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_45FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_46FF.S b/vm/mterp/mips/OP_UNUSED_46FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_46FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_47FF.S b/vm/mterp/mips/OP_UNUSED_47FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_47FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_48FF.S b/vm/mterp/mips/OP_UNUSED_48FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_48FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_49FF.S b/vm/mterp/mips/OP_UNUSED_49FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_49FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4AFF.S b/vm/mterp/mips/OP_UNUSED_4AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4BFF.S b/vm/mterp/mips/OP_UNUSED_4BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4CFF.S b/vm/mterp/mips/OP_UNUSED_4CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4DFF.S b/vm/mterp/mips/OP_UNUSED_4DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4EFF.S b/vm/mterp/mips/OP_UNUSED_4EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_4FFF.S b/vm/mterp/mips/OP_UNUSED_4FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_4FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_50FF.S b/vm/mterp/mips/OP_UNUSED_50FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_50FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_51FF.S b/vm/mterp/mips/OP_UNUSED_51FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_51FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_52FF.S b/vm/mterp/mips/OP_UNUSED_52FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_52FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_53FF.S b/vm/mterp/mips/OP_UNUSED_53FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_53FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_54FF.S b/vm/mterp/mips/OP_UNUSED_54FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_54FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_55FF.S b/vm/mterp/mips/OP_UNUSED_55FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_55FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_56FF.S b/vm/mterp/mips/OP_UNUSED_56FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_56FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_57FF.S b/vm/mterp/mips/OP_UNUSED_57FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_57FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_58FF.S b/vm/mterp/mips/OP_UNUSED_58FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_58FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_59FF.S b/vm/mterp/mips/OP_UNUSED_59FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_59FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5AFF.S b/vm/mterp/mips/OP_UNUSED_5AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5BFF.S b/vm/mterp/mips/OP_UNUSED_5BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5CFF.S b/vm/mterp/mips/OP_UNUSED_5CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5DFF.S b/vm/mterp/mips/OP_UNUSED_5DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5EFF.S b/vm/mterp/mips/OP_UNUSED_5EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_5FFF.S b/vm/mterp/mips/OP_UNUSED_5FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_5FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_60FF.S b/vm/mterp/mips/OP_UNUSED_60FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_60FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_61FF.S b/vm/mterp/mips/OP_UNUSED_61FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_61FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_62FF.S b/vm/mterp/mips/OP_UNUSED_62FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_62FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_63FF.S b/vm/mterp/mips/OP_UNUSED_63FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_63FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_64FF.S b/vm/mterp/mips/OP_UNUSED_64FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_64FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_65FF.S b/vm/mterp/mips/OP_UNUSED_65FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_65FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_66FF.S b/vm/mterp/mips/OP_UNUSED_66FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_66FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_67FF.S b/vm/mterp/mips/OP_UNUSED_67FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_67FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_68FF.S b/vm/mterp/mips/OP_UNUSED_68FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_68FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_69FF.S b/vm/mterp/mips/OP_UNUSED_69FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_69FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6AFF.S b/vm/mterp/mips/OP_UNUSED_6AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6BFF.S b/vm/mterp/mips/OP_UNUSED_6BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6CFF.S b/vm/mterp/mips/OP_UNUSED_6CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6DFF.S b/vm/mterp/mips/OP_UNUSED_6DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6EFF.S b/vm/mterp/mips/OP_UNUSED_6EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_6FFF.S b/vm/mterp/mips/OP_UNUSED_6FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_6FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_70FF.S b/vm/mterp/mips/OP_UNUSED_70FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_70FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_71FF.S b/vm/mterp/mips/OP_UNUSED_71FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_71FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_72FF.S b/vm/mterp/mips/OP_UNUSED_72FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_72FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_73FF.S b/vm/mterp/mips/OP_UNUSED_73FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_73FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_74FF.S b/vm/mterp/mips/OP_UNUSED_74FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_74FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_75FF.S b/vm/mterp/mips/OP_UNUSED_75FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_75FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_76FF.S b/vm/mterp/mips/OP_UNUSED_76FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_76FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_77FF.S b/vm/mterp/mips/OP_UNUSED_77FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_77FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_78FF.S b/vm/mterp/mips/OP_UNUSED_78FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_78FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_79FF.S b/vm/mterp/mips/OP_UNUSED_79FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_79FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7AFF.S b/vm/mterp/mips/OP_UNUSED_7AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7BFF.S b/vm/mterp/mips/OP_UNUSED_7BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7CFF.S b/vm/mterp/mips/OP_UNUSED_7CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7DFF.S b/vm/mterp/mips/OP_UNUSED_7DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7EFF.S b/vm/mterp/mips/OP_UNUSED_7EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_7FFF.S b/vm/mterp/mips/OP_UNUSED_7FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_7FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_80FF.S b/vm/mterp/mips/OP_UNUSED_80FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_80FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_81FF.S b/vm/mterp/mips/OP_UNUSED_81FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_81FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_82FF.S b/vm/mterp/mips/OP_UNUSED_82FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_82FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_83FF.S b/vm/mterp/mips/OP_UNUSED_83FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_83FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_84FF.S b/vm/mterp/mips/OP_UNUSED_84FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_84FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_85FF.S b/vm/mterp/mips/OP_UNUSED_85FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_85FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_86FF.S b/vm/mterp/mips/OP_UNUSED_86FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_86FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_87FF.S b/vm/mterp/mips/OP_UNUSED_87FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_87FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_88FF.S b/vm/mterp/mips/OP_UNUSED_88FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_88FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_89FF.S b/vm/mterp/mips/OP_UNUSED_89FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_89FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8AFF.S b/vm/mterp/mips/OP_UNUSED_8AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8BFF.S b/vm/mterp/mips/OP_UNUSED_8BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8CFF.S b/vm/mterp/mips/OP_UNUSED_8CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8DFF.S b/vm/mterp/mips/OP_UNUSED_8DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8EFF.S b/vm/mterp/mips/OP_UNUSED_8EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_8FFF.S b/vm/mterp/mips/OP_UNUSED_8FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_8FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_90FF.S b/vm/mterp/mips/OP_UNUSED_90FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_90FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_91FF.S b/vm/mterp/mips/OP_UNUSED_91FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_91FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_92FF.S b/vm/mterp/mips/OP_UNUSED_92FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_92FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_93FF.S b/vm/mterp/mips/OP_UNUSED_93FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_93FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_94FF.S b/vm/mterp/mips/OP_UNUSED_94FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_94FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_95FF.S b/vm/mterp/mips/OP_UNUSED_95FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_95FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_96FF.S b/vm/mterp/mips/OP_UNUSED_96FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_96FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_97FF.S b/vm/mterp/mips/OP_UNUSED_97FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_97FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_98FF.S b/vm/mterp/mips/OP_UNUSED_98FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_98FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_99FF.S b/vm/mterp/mips/OP_UNUSED_99FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_99FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9AFF.S b/vm/mterp/mips/OP_UNUSED_9AFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9AFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9BFF.S b/vm/mterp/mips/OP_UNUSED_9BFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9BFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9CFF.S b/vm/mterp/mips/OP_UNUSED_9CFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9CFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9DFF.S b/vm/mterp/mips/OP_UNUSED_9DFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9DFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9EFF.S b/vm/mterp/mips/OP_UNUSED_9EFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9EFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_9FFF.S b/vm/mterp/mips/OP_UNUSED_9FFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_9FFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A0FF.S b/vm/mterp/mips/OP_UNUSED_A0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A1FF.S b/vm/mterp/mips/OP_UNUSED_A1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A2FF.S b/vm/mterp/mips/OP_UNUSED_A2FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A3FF.S b/vm/mterp/mips/OP_UNUSED_A3FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A4FF.S b/vm/mterp/mips/OP_UNUSED_A4FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A5FF.S b/vm/mterp/mips/OP_UNUSED_A5FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A6FF.S b/vm/mterp/mips/OP_UNUSED_A6FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A7FF.S b/vm/mterp/mips/OP_UNUSED_A7FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A8FF.S b/vm/mterp/mips/OP_UNUSED_A8FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_A9FF.S b/vm/mterp/mips/OP_UNUSED_A9FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_A9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_AAFF.S b/vm/mterp/mips/OP_UNUSED_AAFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_AAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_ABFF.S b/vm/mterp/mips/OP_UNUSED_ABFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_ABFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_ACFF.S b/vm/mterp/mips/OP_UNUSED_ACFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_ACFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_ADFF.S b/vm/mterp/mips/OP_UNUSED_ADFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_ADFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_AEFF.S b/vm/mterp/mips/OP_UNUSED_AEFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_AEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_AFFF.S b/vm/mterp/mips/OP_UNUSED_AFFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_AFFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B0FF.S b/vm/mterp/mips/OP_UNUSED_B0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B1FF.S b/vm/mterp/mips/OP_UNUSED_B1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B2FF.S b/vm/mterp/mips/OP_UNUSED_B2FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B3FF.S b/vm/mterp/mips/OP_UNUSED_B3FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B4FF.S b/vm/mterp/mips/OP_UNUSED_B4FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B5FF.S b/vm/mterp/mips/OP_UNUSED_B5FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B6FF.S b/vm/mterp/mips/OP_UNUSED_B6FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B7FF.S b/vm/mterp/mips/OP_UNUSED_B7FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B8FF.S b/vm/mterp/mips/OP_UNUSED_B8FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_B9FF.S b/vm/mterp/mips/OP_UNUSED_B9FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_B9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BAFF.S b/vm/mterp/mips/OP_UNUSED_BAFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BBFF.S b/vm/mterp/mips/OP_UNUSED_BBFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BCFF.S b/vm/mterp/mips/OP_UNUSED_BCFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BDFF.S b/vm/mterp/mips/OP_UNUSED_BDFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BEFF.S b/vm/mterp/mips/OP_UNUSED_BEFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_BFFF.S b/vm/mterp/mips/OP_UNUSED_BFFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_BFFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C0FF.S b/vm/mterp/mips/OP_UNUSED_C0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C1FF.S b/vm/mterp/mips/OP_UNUSED_C1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C2FF.S b/vm/mterp/mips/OP_UNUSED_C2FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C3FF.S b/vm/mterp/mips/OP_UNUSED_C3FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C4FF.S b/vm/mterp/mips/OP_UNUSED_C4FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C5FF.S b/vm/mterp/mips/OP_UNUSED_C5FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C6FF.S b/vm/mterp/mips/OP_UNUSED_C6FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C7FF.S b/vm/mterp/mips/OP_UNUSED_C7FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C8FF.S b/vm/mterp/mips/OP_UNUSED_C8FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_C9FF.S b/vm/mterp/mips/OP_UNUSED_C9FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_C9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CAFF.S b/vm/mterp/mips/OP_UNUSED_CAFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CBFF.S b/vm/mterp/mips/OP_UNUSED_CBFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CCFF.S b/vm/mterp/mips/OP_UNUSED_CCFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CDFF.S b/vm/mterp/mips/OP_UNUSED_CDFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CEFF.S b/vm/mterp/mips/OP_UNUSED_CEFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_CFFF.S b/vm/mterp/mips/OP_UNUSED_CFFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_CFFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D0FF.S b/vm/mterp/mips/OP_UNUSED_D0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D1FF.S b/vm/mterp/mips/OP_UNUSED_D1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D2FF.S b/vm/mterp/mips/OP_UNUSED_D2FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D3FF.S b/vm/mterp/mips/OP_UNUSED_D3FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D4FF.S b/vm/mterp/mips/OP_UNUSED_D4FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D5FF.S b/vm/mterp/mips/OP_UNUSED_D5FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D6FF.S b/vm/mterp/mips/OP_UNUSED_D6FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D7FF.S b/vm/mterp/mips/OP_UNUSED_D7FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D8FF.S b/vm/mterp/mips/OP_UNUSED_D8FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_D9FF.S b/vm/mterp/mips/OP_UNUSED_D9FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_D9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DAFF.S b/vm/mterp/mips/OP_UNUSED_DAFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DBFF.S b/vm/mterp/mips/OP_UNUSED_DBFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DCFF.S b/vm/mterp/mips/OP_UNUSED_DCFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DCFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DDFF.S b/vm/mterp/mips/OP_UNUSED_DDFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DEFF.S b/vm/mterp/mips/OP_UNUSED_DEFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_DFFF.S b/vm/mterp/mips/OP_UNUSED_DFFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_DFFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E0FF.S b/vm/mterp/mips/OP_UNUSED_E0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E1FF.S b/vm/mterp/mips/OP_UNUSED_E1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E2FF.S b/vm/mterp/mips/OP_UNUSED_E2FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E2FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E3FF.S b/vm/mterp/mips/OP_UNUSED_E3FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E3FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E4FF.S b/vm/mterp/mips/OP_UNUSED_E4FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E4FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E5FF.S b/vm/mterp/mips/OP_UNUSED_E5FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E5FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E6FF.S b/vm/mterp/mips/OP_UNUSED_E6FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E6FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E7FF.S b/vm/mterp/mips/OP_UNUSED_E7FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E7FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E8FF.S b/vm/mterp/mips/OP_UNUSED_E8FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E8FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_E9FF.S b/vm/mterp/mips/OP_UNUSED_E9FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_E9FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_EAFF.S b/vm/mterp/mips/OP_UNUSED_EAFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_EAFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_EBFF.S b/vm/mterp/mips/OP_UNUSED_EBFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_EBFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_ECFF.S b/vm/mterp/mips/OP_UNUSED_ECFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_ECFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_EDFF.S b/vm/mterp/mips/OP_UNUSED_EDFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_EDFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_EEFF.S b/vm/mterp/mips/OP_UNUSED_EEFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_EEFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_EFFF.S b/vm/mterp/mips/OP_UNUSED_EFFF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_EFFF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_F0FF.S b/vm/mterp/mips/OP_UNUSED_F0FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_F0FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/OP_UNUSED_F1FF.S b/vm/mterp/mips/OP_UNUSED_F1FF.S
deleted file mode 100644
index 99ef3cf..0000000
--- a/vm/mterp/mips/OP_UNUSED_F1FF.S
+++ /dev/null
@@ -1 +0,0 @@
-%include "mips/unused.S"
diff --git a/vm/mterp/mips/footer.S b/vm/mterp/mips/footer.S
index b5b53b7..54da6c3 100644
--- a/vm/mterp/mips/footer.S
+++ b/vm/mterp/mips/footer.S
@@ -481,37 +481,6 @@
 #endif
 
 /*
- * Common code for jumbo method invocation.
- * NOTE: this adjusts rPC to account for the difference in instruction width.
- * As a result, the savedPc in the stack frame will not be wholly accurate. So
- * long as that is only used for source file line number calculations, we're
- * okay.
- */
-common_invokeMethodJumboNoThis:
-#if defined(WITH_JIT)
- /* On entry: a0 is "Method* methodToCall */
-    li       rOBJ, 0                     # clear "this"
-#endif
-common_invokeMethodJumbo:
- /* On entry: a0 is "Method* methodToCall, rOBJ is "this" */
-.LinvokeNewJumbo:
-#if defined(WITH_JIT)
-    lhu      a1, offThread_subMode(rSELF)
-    andi     a1, kSubModeJitTraceBuild
-    beqz     a1, 1f
-    JAL(save_callsiteinfo)
-#endif
-/* prepare to copy args to "outs" area of current frame */
-1:
-    add      rPC, rPC, 4          # adjust pc to make return consistent
-    FETCH(a2, 1)
-    SAVEAREA_FROM_FP(rBIX, rFP)   # rBIX <- stack save area
-    beqz     a2, .LinvokeArgsDone  # if no args, skip the rest
-    FETCH(a1, 2)                  # a1 <- CCCC
-    b         .LinvokeRangeArgs   # handle args like invoke range
-
-
-/*
  * Common code for method invocation with range.
  *
  * On entry:
@@ -882,7 +851,6 @@
     lw       a1, offThread_method(rSELF)
     move     a0, rSELF
     lw       a1, offMethod_insns(a1)
-    lhu      ra, offThread_subMode(rSELF)
     move     a2, rOBJ
     subu     a1, rPC, a1
     sra      a1, a1, 1
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index a7eeb50..a173c72 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -430,8 +430,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -462,8 +462,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -538,8 +538,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -756,8 +756,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_STRING_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -775,8 +775,8 @@
     cmp     r0, #0
     beq     .LOP_CONST_STRING_JUMBO_resolve
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -792,8 +792,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_CLASS_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -7734,8 +7734,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_STRING_JUMBO */
@@ -7753,8 +7753,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_CLASS */
@@ -7773,8 +7773,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CHECK_CAST */
@@ -7892,8 +7892,8 @@
 #endif
 .LOP_NEW_INSTANCE_end:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r3)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 #if defined(WITH_JIT)
@@ -7912,8 +7912,8 @@
     mov     r1, rPC
     bl      dvmJitEndTraceSelect        @ (self, pc)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r9, r10)                   @ vAA<- new object
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 #endif
 
@@ -8238,8 +8238,8 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_skip_check:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_throw:
     @ The types don't match.  We need to throw an ArrayStoreException.
@@ -8416,10 +8416,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_WIDE */
@@ -8464,10 +8464,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -8488,10 +8488,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_BYTE */
@@ -8510,10 +8510,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_CHAR */
@@ -8532,10 +8532,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_SHORT */
@@ -8554,10 +8554,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET */
@@ -9314,10 +9314,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET_VOLATILE */
@@ -9671,10 +9671,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -16489,7 +16489,6 @@
     ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
     mov     r0, rSELF                   @ r0<- self
     ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
-    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
     mov     r2, r9                      @ r2<- exception
     sub     r1, rPC, r1                 @ r1<- pc - method->insns
     mov     r1, r1, asr #1              @ r1<- offset in code units
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index c0f27b3..7b6c9d1 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -430,8 +430,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -462,8 +462,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -538,8 +538,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -756,8 +756,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_STRING_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -775,8 +775,8 @@
     cmp     r0, #0
     beq     .LOP_CONST_STRING_JUMBO_resolve
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -792,8 +792,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_CLASS_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -8056,8 +8056,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_STRING_JUMBO */
@@ -8075,8 +8075,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_CLASS */
@@ -8095,8 +8095,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CHECK_CAST */
@@ -8214,8 +8214,8 @@
 #endif
 .LOP_NEW_INSTANCE_end:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r3)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 #if defined(WITH_JIT)
@@ -8234,8 +8234,8 @@
     mov     r1, rPC
     bl      dvmJitEndTraceSelect        @ (self, pc)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r9, r10)                   @ vAA<- new object
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 #endif
 
@@ -8696,8 +8696,8 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_skip_check:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_throw:
     @ The types don't match.  We need to throw an ArrayStoreException.
@@ -8874,10 +8874,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_WIDE */
@@ -8922,10 +8922,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -8946,10 +8946,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_BYTE */
@@ -8968,10 +8968,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_CHAR */
@@ -8990,10 +8990,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_SHORT */
@@ -9012,10 +9012,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET */
@@ -9772,10 +9772,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET_VOLATILE */
@@ -10129,10 +10129,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -16947,7 +16947,6 @@
     ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
     mov     r0, rSELF                   @ r0<- self
     ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
-    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
     mov     r2, r9                      @ r2<- exception
     sub     r1, rPC, r1                 @ r1<- pc - method->insns
     mov     r1, r1, asr #1              @ r1<- offset in code units
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index afa47db..c3419c2 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -474,8 +474,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -550,8 +550,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -767,8 +767,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_STRING_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -786,8 +786,8 @@
     cmp     r0, #0
     beq     .LOP_CONST_STRING_JUMBO_resolve
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -803,8 +803,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_CLASS_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -7357,8 +7357,8 @@
     beq     common_errNullObject        @ object was null
     ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -7688,8 +7688,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_STRING_JUMBO */
@@ -7707,8 +7707,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_CLASS */
@@ -7727,8 +7727,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CHECK_CAST */
@@ -7846,8 +7846,8 @@
 #endif
 .LOP_NEW_INSTANCE_end:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r3)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 #if defined(WITH_JIT)
@@ -7866,8 +7866,8 @@
     mov     r1, rPC
     bl      dvmJitEndTraceSelect        @ (self, pc)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r9, r10)                   @ vAA<- new object
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 #endif
 
@@ -8192,8 +8192,8 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_skip_check:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_throw:
     @ The types don't match.  We need to throw an ArrayStoreException.
@@ -8218,8 +8218,8 @@
     ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
     ubfx    r2, rINST, #8, #4           @ r2<- A
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IGET_WIDE */
@@ -8361,8 +8361,8 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_WIDE */
@@ -8401,10 +8401,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -8425,10 +8425,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_BYTE */
@@ -8447,10 +8447,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_CHAR */
@@ -8469,10 +8469,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_SHORT */
@@ -8491,10 +8491,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET */
@@ -9251,10 +9251,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET_VOLATILE */
@@ -9608,10 +9608,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -16426,7 +16426,6 @@
     ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
     mov     r0, rSELF                   @ r0<- self
     ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
-    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
     mov     r2, r9                      @ r2<- exception
     sub     r1, rPC, r1                 @ r1<- pc - method->insns
     mov     r1, r1, asr #1              @ r1<- offset in code units
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 9ce376e..2542245 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -474,8 +474,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -550,8 +550,8 @@
     add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
     FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -767,8 +767,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_STRING_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -786,8 +786,8 @@
     cmp     r0, #0
     beq     .LOP_CONST_STRING_JUMBO_resolve
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -803,8 +803,8 @@
     cmp     r0, #0                      @ not yet resolved?
     beq     .LOP_CONST_CLASS_resolve
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -7357,8 +7357,8 @@
     beq     common_errNullObject        @ object was null
     ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* ------------------------------ */
@@ -7688,8 +7688,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_STRING_JUMBO */
@@ -7707,8 +7707,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CONST_CLASS */
@@ -7727,8 +7727,8 @@
     cmp     r0, #0                      @ failed?
     beq     common_exceptionThrown      @ yup, handle the exception
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r9)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_CHECK_CAST */
@@ -7846,8 +7846,8 @@
 #endif
 .LOP_NEW_INSTANCE_end:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r3)                    @ vAA<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 #if defined(WITH_JIT)
@@ -7866,8 +7866,8 @@
     mov     r1, rPC
     bl      dvmJitEndTraceSelect        @ (self, pc)
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r9, r10)                   @ vAA<- new object
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 #endif
 
@@ -8192,8 +8192,8 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_skip_check:
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 .LOP_APUT_OBJECT_throw:
     @ The types don't match.  We need to throw an ArrayStoreException.
@@ -8218,8 +8218,8 @@
     ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
     ubfx    r2, rINST, #8, #4           @ r2<- A
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SET_VREG(r0, r2)                    @ fp[A]<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IGET_WIDE */
@@ -8361,8 +8361,8 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_WIDE */
@@ -8401,10 +8401,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -8425,10 +8425,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_BYTE */
@@ -8447,10 +8447,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_CHAR */
@@ -8469,10 +8469,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_IPUT_SHORT */
@@ -8491,10 +8491,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     @ no-op                         @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     @ no-op 
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET */
@@ -9251,10 +9251,10 @@
     GET_VREG(r0, r1)                    @ r0<- fp[A]
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /* continuation for OP_SGET_VOLATILE */
@@ -9608,10 +9608,10 @@
     ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
     beq     common_errNullObject        @ object was null
     FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
-    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     SMP_DMB_ST                        @ releasing store
     str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
     SMP_DMB
+    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     cmp     r0, #0                      @ stored a null reference?
     strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
     GOTO_OPCODE(ip)                     @ jump to next instruction
@@ -16426,7 +16426,6 @@
     ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
     mov     r0, rSELF                   @ r0<- self
     ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
-    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
     mov     r2, r9                      @ r2<- exception
     sub     r1, rPC, r1                 @ r1<- pc - method->insns
     mov     r1, r1, asr #1              @ r1<- offset in code units
diff --git a/vm/mterp/out/InterpAsm-mips.S b/vm/mterp/out/InterpAsm-mips.S
index 98837fd..3e1c670 100644
--- a/vm/mterp/out/InterpAsm-mips.S
+++ b/vm/mterp/out/InterpAsm-mips.S
@@ -1542,15 +1542,15 @@
     move      a1, rBIX                     #  a1 <- vCC
     b         OP_CMPL_FLOAT_continue
 #else
-    GET_VREG_F(fs0, a2)
-    GET_VREG_F(fs1, a3)
-    c.olt.s   fcc0, fs0, fs1               # Is fs0 < fs1
+    GET_VREG_F(ft0, a2)
+    GET_VREG_F(ft1, a3)
+    c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
     li        rTEMP, -1
     bc1t      fcc0, OP_CMPL_FLOAT_finish
-    c.olt.s   fcc0, fs1, fs0
+    c.olt.s   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, OP_CMPL_FLOAT_finish
-    c.eq.s    fcc0, fs0, fs1
+    c.eq.s    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, OP_CMPL_FLOAT_finish
     b         OP_CMPL_FLOAT_nan
@@ -1605,15 +1605,15 @@
     move      a1, rBIX                     #  a1 <- vCC
     b         OP_CMPG_FLOAT_continue
 #else
-    GET_VREG_F(fs0, a2)
-    GET_VREG_F(fs1, a3)
-    c.olt.s   fcc0, fs0, fs1               # Is fs0 < fs1
+    GET_VREG_F(ft0, a2)
+    GET_VREG_F(ft1, a3)
+    c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
     li        rTEMP, -1
     bc1t      fcc0, OP_CMPG_FLOAT_finish
-    c.olt.s   fcc0, fs1, fs0
+    c.olt.s   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, OP_CMPG_FLOAT_finish
-    c.eq.s    fcc0, fs0, fs1
+    c.eq.s    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, OP_CMPG_FLOAT_finish
     b         OP_CMPG_FLOAT_nan
@@ -1659,15 +1659,15 @@
     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
     b         OP_CMPL_DOUBLE_continue
 #else
-    LOAD64_F(fs0, fs0f, rOBJ)
-    LOAD64_F(fs1, fs1f, rBIX)
-    c.olt.d   fcc0, fs0, fs1
+    LOAD64_F(ft0, ft0f, rOBJ)
+    LOAD64_F(ft1, ft1f, rBIX)
+    c.olt.d   fcc0, ft0, ft1
     li        rTEMP, -1
     bc1t      fcc0, OP_CMPL_DOUBLE_finish
-    c.olt.d   fcc0, fs1, fs0
+    c.olt.d   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, OP_CMPL_DOUBLE_finish
-    c.eq.d    fcc0, fs0, fs1
+    c.eq.d    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, OP_CMPL_DOUBLE_finish
     b         OP_CMPL_DOUBLE_nan
@@ -1711,15 +1711,15 @@
     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
     b         OP_CMPG_DOUBLE_continue
 #else
-    LOAD64_F(fs0, fs0f, rOBJ)
-    LOAD64_F(fs1, fs1f, rBIX)
-    c.olt.d   fcc0, fs0, fs1
+    LOAD64_F(ft0, ft0f, rOBJ)
+    LOAD64_F(ft1, ft1f, rBIX)
+    c.olt.d   fcc0, ft0, ft1
     li        rTEMP, -1
     bc1t      fcc0, OP_CMPG_DOUBLE_finish
-    c.olt.d   fcc0, fs1, fs0
+    c.olt.d   fcc0, ft1, ft0
     li        rTEMP, 1
     bc1t      fcc0, OP_CMPG_DOUBLE_finish
-    c.eq.d    fcc0, fs0, fs1
+    c.eq.d    fcc0, ft0, ft1
     li        rTEMP, 0
     bc1t      fcc0, OP_CMPG_DOUBLE_finish
     b         OP_CMPG_DOUBLE_nan
@@ -10850,14 +10850,14 @@
     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
     GET_OPB(a0)                            #  a0 <- B
     # Stack should have 16/20 available
-    sw        a1, 16(sp)                   #  push &self->retval
+    sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
     BAL(.LOP_EXECUTE_INLINE_continue)              #  make call; will return after
     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
     move      rINST, v0                    #  save result of inline
     move      a0, rOBJ                     #  a0<- method
     move      a1, rSELF                    #  a1<- self
-    JAL(dvmFastMethodTraceExit)            #  (method, self)
-    beqz      v0, common_exceptionThrown   #  returned false, handle exception
+    JAL(dvmFastNativeMethodTraceExit)      #  (method, self)
+    beqz      rINST, common_exceptionThrown   #  returned false, handle exception
     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
     GOTO_OPCODE(t0)                        #  jump to next instruction
@@ -10912,7 +10912,7 @@
     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
     GET_OPA(a0)                            #  a0 <- A
     # Stack should have 16/20 available
-    sw        a1, 16(sp)                   #  push &self->retval
+    sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
     move      rINST, rOBJ                  #  rINST<- method
     BAL(.LOP_EXECUTE_INLINE_RANGE_continue)              #  make call; will return after
     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
@@ -10935,11 +10935,7 @@
      */
 .LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
     lw      a1, offThread_mainHandlerTable(rSELF)
-    .if 0
-    li      t0, OP_INVOKE_DIRECT_JUMBO
-    .else
     li      t0, OP_INVOKE_DIRECT_RANGE
-    .endif
     GOTO_OPCODE_BASE(a1, t0)            # execute it
 
 /* continuation for OP_IPUT_OBJECT_VOLATILE */
@@ -11487,37 +11483,6 @@
 #endif
 
 /*
- * Common code for jumbo method invocation.
- * NOTE: this adjusts rPC to account for the difference in instruction width.
- * As a result, the savedPc in the stack frame will not be wholly accurate. So
- * long as that is only used for source file line number calculations, we're
- * okay.
- */
-common_invokeMethodJumboNoThis:
-#if defined(WITH_JIT)
- /* On entry: a0 is "Method* methodToCall */
-    li       rOBJ, 0                     # clear "this"
-#endif
-common_invokeMethodJumbo:
- /* On entry: a0 is "Method* methodToCall, rOBJ is "this" */
-.LinvokeNewJumbo:
-#if defined(WITH_JIT)
-    lhu      a1, offThread_subMode(rSELF)
-    andi     a1, kSubModeJitTraceBuild
-    beqz     a1, 1f
-    JAL(save_callsiteinfo)
-#endif
-/* prepare to copy args to "outs" area of current frame */
-1:
-    add      rPC, rPC, 4          # adjust pc to make return consistent
-    FETCH(a2, 1)
-    SAVEAREA_FROM_FP(rBIX, rFP)   # rBIX <- stack save area
-    beqz     a2, .LinvokeArgsDone  # if no args, skip the rest
-    FETCH(a1, 2)                  # a1 <- CCCC
-    b         .LinvokeRangeArgs   # handle args like invoke range
-
-
-/*
  * Common code for method invocation with range.
  *
  * On entry:
@@ -11888,7 +11853,6 @@
     lw       a1, offThread_method(rSELF)
     move     a0, rSELF
     lw       a1, offMethod_insns(a1)
-    lhu      ra, offThread_subMode(rSELF)
     move     a2, rOBJ
     subu     a1, rPC, a1
     sra      a1, a1, 1
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 0aa94eb..760e674 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -16027,8 +16027,7 @@
 /*
  * For the invoke codes we need to know what register holds the "this" pointer. However
  * it seems the this pointer is assigned consistently most times it is in %ecx but other
- * times it is in OP_INVOKE_INTERFACE_JUMBO OP_INVOKE_INTERFACE OP_INVOKE_SUPER_QUICK and
- * OP_INVOKE_VIRTUAL_QUICK
+ * times it is in OP_INVOKE_INTERFACE, OP_INVOKE_SUPER_QUICK, or OP_INVOKE_VIRTUAL_QUICK.
 */
 
 /*
@@ -16594,7 +16593,6 @@
 
     movl       offThread_method(%ecx), %eax # %eax = self->method
     movl       offMethod_insns(%eax), %eax  # %eax = self->method->insn
-    # ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags  # TODO
     movl       rPC, %ecx
     subl       %eax, %ecx              # %ecx = pc - self->method->insn
     sar        $1, %ecx                # adjust %ecx for code offset
diff --git a/vm/mterp/x86/OP_INVOKE_OBJECT_INIT_RANGE.S b/vm/mterp/x86/OP_INVOKE_OBJECT_INIT_RANGE.S
index d5d10a6..f6e3f42 100644
--- a/vm/mterp/x86/OP_INVOKE_OBJECT_INIT_RANGE.S
+++ b/vm/mterp/x86/OP_INVOKE_OBJECT_INIT_RANGE.S
@@ -1,4 +1,4 @@
-%default { "jumbo":"0", "cccc":"2" }
+%default { "cccc":"2" }
 %verify "executed"
 %verify "finalizable class"
     /*
@@ -6,7 +6,7 @@
      * Object's nullary constructor doesn't do anything, so we just
      * skip it unless a debugger is active.
      */
-    movzwl     4(rPC),%eax              # eax<- CCCC, offset = 2 * cccc, cccc = 4 for jumbo
+    movzwl     4(rPC),%eax              # eax<- CCCC, offset = 2 * cccc
     GET_VREG_R %ecx, %eax               # ecx<- "this" ptr
     testl      %ecx,%ecx                # null this?
     je         common_errNullObject     # yes, fail
@@ -45,11 +45,7 @@
      */
 .L${opcode}_debugger:
     movl    offThread_mainHandlerTable(%ecx), %ecx # load main handler table
-    .if $jumbo                               # if jumbo is enabled
-    movl       $$OP_INVOKE_DIRECT_JUMBO, %eax
-    .else
     movl       $$OP_INVOKE_DIRECT_RANGE, %eax
-    .endif
     /*
      * We can't use GOTO_NEXT here since we want to jump directly to
      * handler without touching rIBASE.
diff --git a/vm/mterp/x86/footer.S b/vm/mterp/x86/footer.S
index 52e55e9..3b5c79e 100644
--- a/vm/mterp/x86/footer.S
+++ b/vm/mterp/x86/footer.S
@@ -350,8 +350,7 @@
 /*
  * For the invoke codes we need to know what register holds the "this" pointer. However
  * it seems the this pointer is assigned consistently most times it is in %ecx but other
- * times it is in OP_INVOKE_INTERFACE_JUMBO OP_INVOKE_INTERFACE OP_INVOKE_SUPER_QUICK and
- * OP_INVOKE_VIRTUAL_QUICK
+ * times it is in OP_INVOKE_INTERFACE, OP_INVOKE_SUPER_QUICK, or OP_INVOKE_VIRTUAL_QUICK.
 */
 
 /*
@@ -917,7 +916,6 @@
 
     movl       offThread_method(%ecx), %eax # %eax = self->method
     movl       offMethod_insns(%eax), %eax  # %eax = self->method->insn
-    # ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags  # TODO
     movl       rPC, %ecx
     subl       %eax, %ecx              # %ecx = pc - self->method->insn
     sar        $$1, %ecx                # adjust %ecx for code offset
diff --git a/vm/native/dalvik_system_Zygote.cpp b/vm/native/dalvik_system_Zygote.cpp
index 269b961..70d4fea 100644
--- a/vm/native/dalvik_system_Zygote.cpp
+++ b/vm/native/dalvik_system_Zygote.cpp
@@ -20,9 +20,7 @@
 #include "Dalvik.h"
 #include "native/InternalNativePriv.h"
 
-#ifdef HAVE_SELINUX
 #include <selinux/android.h>
-#endif
 
 #include <signal.h>
 #include <sys/types.h>
@@ -38,6 +36,8 @@
 #include <cutils/sched_policy.h>
 #include <cutils/multiuser.h>
 #include <sched.h>
+#include <sys/utsname.h>
+#include <sys/capability.h>
 
 #if defined(HAVE_PRCTL)
 # include <sys/prctl.h>
@@ -253,7 +253,7 @@
 
     // Create a second private mount namespace for our process
     if (unshare(CLONE_NEWNS) == -1) {
-        SLOGE("Failed to unshare(): %s", strerror(errno));
+        ALOGE("Failed to unshare(): %s", strerror(errno));
         return -1;
     }
 
@@ -265,7 +265,7 @@
         const char* target = getenv("EMULATED_STORAGE_TARGET");
         const char* legacy = getenv("EXTERNAL_STORAGE");
         if (source == NULL || target == NULL || legacy == NULL) {
-            SLOGE("Storage environment undefined; unable to provide external storage");
+            ALOGE("Storage environment undefined; unable to provide external storage");
             return -1;
         }
 
@@ -290,13 +290,13 @@
         if (mountMode == MOUNT_EXTERNAL_MULTIUSER_ALL) {
             // Mount entire external storage tree for all users
             if (mount(source, target, NULL, MS_BIND, NULL) == -1) {
-                SLOGE("Failed to mount %s to %s: %s", source, target, strerror(errno));
+                ALOGE("Failed to mount %s to %s: %s", source, target, strerror(errno));
                 return -1;
             }
         } else {
             // Only mount user-specific external storage
             if (mount(source_user, target_user, NULL, MS_BIND, NULL) == -1) {
-                SLOGE("Failed to mount %s to %s: %s", source_user, target_user, strerror(errno));
+                ALOGE("Failed to mount %s to %s: %s", source_user, target_user, strerror(errno));
                 return -1;
             }
         }
@@ -317,18 +317,18 @@
             return -1;
         }
         if (mount(source_obb, target_obb, NULL, MS_BIND, NULL) == -1) {
-            SLOGE("Failed to mount %s to %s: %s", source_obb, target_obb, strerror(errno));
+            ALOGE("Failed to mount %s to %s: %s", source_obb, target_obb, strerror(errno));
             return -1;
         }
 
         // Finally, mount user-specific path into place for legacy users
         if (mount(target_user, legacy, NULL, MS_BIND | MS_REC, NULL) == -1) {
-            SLOGE("Failed to mount %s to %s: %s", target_user, legacy, strerror(errno));
+            ALOGE("Failed to mount %s to %s: %s", target_user, legacy, strerror(errno));
             return -1;
         }
 
     } else {
-        SLOGE("Mount mode %d unsupported", mountMode);
+        ALOGE("Mount mode %d unsupported", mountMode);
         return -1;
     }
 
@@ -467,7 +467,6 @@
     return 0;
 }
 
-#ifdef HAVE_SELINUX
 /*
  * Set SELinux security context.
  *
@@ -482,7 +481,26 @@
     return 0;
 #endif
 }
+
+static bool needsNoRandomizeWorkaround() {
+#if !defined(__arm__)
+    return false;
+#else
+    int major;
+    int minor;
+    struct utsname uts;
+    if (uname(&uts) == -1) {
+        return false;
+    }
+
+    if (sscanf(uts.release, "%d.%d", &major, &minor) != 2) {
+        return false;
+    }
+
+    // Kernels before 3.4.* need the workaround.
+    return (major < 3) || ((major == 3) && (minor < 4));
 #endif
+}
 
 /*
  * Utility routine to fork zygote and specialize the child process.
@@ -498,10 +516,8 @@
     ArrayObject *rlimits = (ArrayObject *)args[4];
     u4 mountMode = MOUNT_EXTERNAL_NONE;
     int64_t permittedCapabilities, effectiveCapabilities;
-#ifdef HAVE_SELINUX
     char *seInfo = NULL;
     char *niceName = NULL;
-#endif
 
     if (isSystemServer) {
         /*
@@ -516,7 +532,6 @@
     } else {
         mountMode = args[5];
         permittedCapabilities = effectiveCapabilities = 0;
-#ifdef HAVE_SELINUX
         StringObject* seInfoObj = (StringObject*)args[6];
         if (seInfoObj) {
             seInfo = dvmCreateCstrFromString(seInfoObj);
@@ -533,7 +548,6 @@
                 dvmAbort();
             }
         }
-#endif
     }
 
     if (!gDvm.zygote) {
@@ -571,6 +585,21 @@
             }
         }
 
+        for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
+            err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
+            if (err < 0) {
+                if (errno == EINVAL) {
+                    ALOGW("PR_CAPBSET_DROP %d failed: %s. "
+                          "Please make sure your kernel is compiled with "
+                          "file capabilities support enabled.",
+                          i, strerror(errno));
+                } else {
+                    ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));
+                    dvmAbort();
+                }
+            }
+        }
+
 #endif /* HAVE_ANDROID_OS */
 
         if (mountMode != MOUNT_EXTERNAL_NONE) {
@@ -602,22 +631,24 @@
             dvmAbort();
         }
 
-        err = setgid(gid);
+        err = setresgid(gid, gid, gid);
         if (err < 0) {
-            ALOGE("cannot setgid(%d): %s", gid, strerror(errno));
+            ALOGE("cannot setresgid(%d): %s", gid, strerror(errno));
             dvmAbort();
         }
 
-        err = setuid(uid);
+        err = setresuid(uid, uid, uid);
         if (err < 0) {
-            ALOGE("cannot setuid(%d): %s", uid, strerror(errno));
+            ALOGE("cannot setresuid(%d): %s", uid, strerror(errno));
             dvmAbort();
         }
 
-        int current = personality(0xffffFFFF);
-        int success = personality((ADDR_NO_RANDOMIZE | current));
-        if (success == -1) {
-          ALOGW("Personality switch failed. current=%d error=%d\n", current, errno);
+        if (needsNoRandomizeWorkaround()) {
+            int current = personality(0xffffFFFF);
+            int success = personality((ADDR_NO_RANDOMIZE | current));
+            if (success == -1) {
+                ALOGW("Personality switch failed. current=%d error=%d\n", current, errno);
+            }
         }
 
         err = setCapabilities(permittedCapabilities, effectiveCapabilities);
@@ -633,7 +664,6 @@
             dvmAbort();
         }
 
-#ifdef HAVE_SELINUX
         err = setSELinuxContext(uid, isSystemServer, seInfo, niceName);
         if (err < 0) {
             ALOGE("cannot set SELinux context: %s\n", strerror(errno));
@@ -644,7 +674,6 @@
         // lock when we forked.
         free(seInfo);
         free(niceName);
-#endif
 
         /*
          * Our system thread ID has changed.  Get the new one.
@@ -663,10 +692,8 @@
         }
     } else if (pid > 0) {
         /* the parent process */
-#ifdef HAVE_SELINUX
         free(seInfo);
         free(niceName);
-#endif
     }
 
     return pid;
@@ -716,22 +743,6 @@
     RETURN_INT(pid);
 }
 
-/* native private static void nativeExecShell(String command);
- */
-static void Dalvik_dalvik_system_Zygote_execShell(
-        const u4* args, JValue* pResult)
-{
-    StringObject* command = (StringObject*)args[0];
-
-    const char *argp[] = {_PATH_BSHELL, "-c", NULL, NULL};
-    argp[2] = dvmCreateCstrFromString(command);
-
-    ALOGI("Exec: %s %s %s", argp[0], argp[1], argp[2]);
-
-    execv(_PATH_BSHELL, (char**)argp);
-    exit(127);
-}
-
 const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {
     { "nativeFork", "()I",
       Dalvik_dalvik_system_Zygote_fork },
@@ -739,7 +750,5 @@
       Dalvik_dalvik_system_Zygote_forkAndSpecialize },
     { "nativeForkSystemServer", "(II[II[[IJJ)I",
       Dalvik_dalvik_system_Zygote_forkSystemServer },
-    { "nativeExecShell", "(Ljava/lang/String;)V",
-      Dalvik_dalvik_system_Zygote_execShell },
     { NULL, NULL, NULL },
 };
diff --git a/vm/native/java_lang_Runtime.cpp b/vm/native/java_lang_Runtime.cpp
index f4afe0e..2d1c4fe 100644
--- a/vm/native/java_lang_Runtime.cpp
+++ b/vm/native/java_lang_Runtime.cpp
@@ -19,8 +19,10 @@
  */
 #include "Dalvik.h"
 #include "native/InternalNativePriv.h"
-#include <unistd.h>
+
+#include <dlfcn.h>
 #include <limits.h>
+#include <unistd.h>
 
 /*
  * public void gc()
@@ -59,7 +61,7 @@
 }
 
 /*
- * static String nativeLoad(String filename, ClassLoader loader)
+ * static String nativeLoad(String filename, ClassLoader loader, String ldLibraryPath)
  *
  * Load the specified full path as a dynamic library filled with
  * JNI-compatible methods. Returns null on success, or a failure
@@ -70,15 +72,27 @@
 {
     StringObject* fileNameObj = (StringObject*) args[0];
     Object* classLoader = (Object*) args[1];
-    char* fileName = NULL;
-    StringObject* result = NULL;
-    char* reason = NULL;
-    bool success;
+    StringObject* ldLibraryPathObj = (StringObject*) args[2];
 
     assert(fileNameObj != NULL);
-    fileName = dvmCreateCstrFromString(fileNameObj);
+    char* fileName = dvmCreateCstrFromString(fileNameObj);
 
-    success = dvmLoadNativeCode(fileName, classLoader, &reason);
+    if (ldLibraryPathObj != NULL) {
+        char* ldLibraryPath = dvmCreateCstrFromString(ldLibraryPathObj);
+        void* sym = dlsym(RTLD_DEFAULT, "android_update_LD_LIBRARY_PATH");
+        if (sym != NULL) {
+            typedef void (*Fn)(const char*);
+            Fn android_update_LD_LIBRARY_PATH = reinterpret_cast<Fn>(sym);
+            (*android_update_LD_LIBRARY_PATH)(ldLibraryPath);
+        } else {
+            ALOGE("android_update_LD_LIBRARY_PATH not found; .so dependencies will not work!");
+        }
+        free(ldLibraryPath);
+    }
+
+    StringObject* result = NULL;
+    char* reason = NULL;
+    bool success = dvmLoadNativeCode(fileName, classLoader, &reason);
     if (!success) {
         const char* msg = (reason != NULL) ? reason : "unknown failure";
         result = dvmCreateStringFromCstr(msg);
@@ -137,7 +151,7 @@
         Dalvik_java_lang_Runtime_maxMemory },
     { "nativeExit",         "(I)V",
         Dalvik_java_lang_Runtime_nativeExit },
-    { "nativeLoad",         "(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;",
+    { "nativeLoad",         "(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/String;",
         Dalvik_java_lang_Runtime_nativeLoad },
     { "totalMemory",          "()J",
         Dalvik_java_lang_Runtime_totalMemory },
diff --git a/vm/native/java_lang_System.cpp b/vm/native/java_lang_System.cpp
index 6ebf4f3..29063cd 100644
--- a/vm/native/java_lang_System.cpp
+++ b/vm/native/java_lang_System.cpp
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
-/*
- * java.lang.Class native methods
- */
 #include "Dalvik.h"
 #include "native/InternalNativePriv.h"
 
+#include <stdlib.h>
+#include <stdint.h>
+#include <assert.h>
+
 /*
  * The VM makes guarantees about the atomicity of accesses to primitive
  * variables.  These guarantees also apply to elements of arrays.
@@ -45,64 +46,137 @@
  * appropriately for the element type, and that n is a multiple of the
  * element size.
  */
-#ifdef __BIONIC__
-/* always present in bionic libc */
-#define HAVE_MEMMOVE_WORDS
-#endif
 
-#ifdef HAVE_MEMMOVE_WORDS
-extern "C" void _memmove_words(void* dest, const void* src, size_t n);
-#define move16 _memmove_words
-#define move32 _memmove_words
-#else
-static void move16(void* dest, const void* src, size_t n)
-{
+/*
+ * Works like memmove(), except:
+ * - if all arguments are at least 32-bit aligned, we guarantee that we
+ *   will use operations that preserve atomicity of 32-bit values
+ * - if not, we guarantee atomicity of 16-bit values
+ *
+ * If all three arguments are not at least 16-bit aligned, the behavior
+ * of this function is undefined.  (We could remove this restriction by
+ * testing for unaligned values and punting to memmove(), but that's
+ * not currently useful.)
+ *
+ * TODO: add loop for 64-bit alignment
+ * TODO: use __builtin_prefetch
+ * TODO: write an ARM-optimized version
+ */
+static void memmove_words(void* dest, const void* src, size_t n) {
     assert((((uintptr_t) dest | (uintptr_t) src | n) & 0x01) == 0);
 
-    uint16_t* d = (uint16_t*) dest;
-    const uint16_t* s = (uint16_t*) src;
+    char* d = (char*) dest;
+    const char* s = (const char*) src;
+    size_t copyCount;
 
-    n /= sizeof(uint16_t);
+    /*
+     * If the source and destination pointers are the same, this is
+     * an expensive no-op.  Testing for an empty move now allows us
+     * to skip a check later.
+     */
+    if (n == 0 || d == s)
+        return;
 
-    if (d < s) {
-        /* copy forward */
-        while (n--) {
-            *d++ = *s++;
+    /*
+     * Determine if the source and destination buffers will overlap if
+     * we copy data forward (i.e. *dest++ = *src++).
+     *
+     * It's okay if the destination buffer starts before the source and
+     * there is some overlap, because the reader is always ahead of the
+     * writer.
+     */
+    if (__builtin_expect((d < s) || ((size_t)(d - s) >= n), 1)) {
+        /*
+         * Copy forward.  We prefer 32-bit loads and stores even for 16-bit
+         * data, so sort that out.
+         */
+        if ((((uintptr_t) d | (uintptr_t) s) & 0x03) != 0) {
+            /*
+             * Not 32-bit aligned.  Two possibilities:
+             * (1) Congruent, we can align to 32-bit by copying one 16-bit val
+             * (2) Non-congruent, we can do one of:
+             *   a. copy whole buffer as a series of 16-bit values
+             *   b. load/store 32 bits, using shifts to ensure alignment
+             *   c. just copy the as 32-bit values and assume the CPU
+             *      will do a reasonable job
+             *
+             * We're currently using (a), which is suboptimal.
+             */
+            if ((((uintptr_t) d ^ (uintptr_t) s) & 0x03) != 0) {
+                copyCount = n;
+            } else {
+                copyCount = 2;
+            }
+            n -= copyCount;
+            copyCount /= sizeof(uint16_t);
+
+            while (copyCount--) {
+                *(uint16_t*)d = *(uint16_t*)s;
+                d += sizeof(uint16_t);
+                s += sizeof(uint16_t);
+            }
+        }
+
+        /*
+         * Copy 32-bit aligned words.
+         */
+        copyCount = n / sizeof(uint32_t);
+        while (copyCount--) {
+            *(uint32_t*)d = *(uint32_t*)s;
+            d += sizeof(uint32_t);
+            s += sizeof(uint32_t);
+        }
+
+        /*
+         * Check for leftovers.  Either we finished exactly, or we have
+         * one remaining 16-bit chunk.
+         */
+        if ((n & 0x02) != 0) {
+            *(uint16_t*)d = *(uint16_t*)s;
         }
     } else {
-        /* copy backward */
+        /*
+         * Copy backward, starting at the end.
+         */
         d += n;
         s += n;
-        while (n--) {
-            *--d = *--s;
+
+        if ((((uintptr_t) d | (uintptr_t) s) & 0x03) != 0) {
+            /* try for 32-bit alignment */
+            if ((((uintptr_t) d ^ (uintptr_t) s) & 0x03) != 0) {
+                copyCount = n;
+            } else {
+                copyCount = 2;
+            }
+            n -= copyCount;
+            copyCount /= sizeof(uint16_t);
+
+            while (copyCount--) {
+                d -= sizeof(uint16_t);
+                s -= sizeof(uint16_t);
+                *(uint16_t*)d = *(uint16_t*)s;
+            }
+        }
+
+        /* copy 32-bit aligned words */
+        copyCount = n / sizeof(uint32_t);
+        while (copyCount--) {
+            d -= sizeof(uint32_t);
+            s -= sizeof(uint32_t);
+            *(uint32_t*)d = *(uint32_t*)s;
+        }
+
+        /* copy leftovers */
+        if ((n & 0x02) != 0) {
+            d -= sizeof(uint16_t);
+            s -= sizeof(uint16_t);
+            *(uint16_t*)d = *(uint16_t*)s;
         }
     }
 }
 
-static void move32(void* dest, const void* src, size_t n)
-{
-    assert((((uintptr_t) dest | (uintptr_t) src | n) & 0x03) == 0);
-
-    uint32_t* d = (uint32_t*) dest;
-    const uint32_t* s = (uint32_t*) src;
-
-    n /= sizeof(uint32_t);
-
-    if (d < s) {
-        /* copy forward */
-        while (n--) {
-            *d++ = *s++;
-        }
-    } else {
-        /* copy backward */
-        d += n;
-        s += n;
-        while (n--) {
-            *--d = *--s;
-        }
-    }
-}
-#endif /*HAVE_MEMMOVE_WORDS*/
+#define move16 memmove_words
+#define move32 memmove_words
 
 /*
  * public static void arraycopy(Object src, int srcPos, Object dest,
diff --git a/vm/oo/Class.cpp b/vm/oo/Class.cpp
index 85ac9a7..78a2273 100644
--- a/vm/oo/Class.cpp
+++ b/vm/oo/Class.cpp
@@ -3232,7 +3232,9 @@
                     == 0)
                 {
                     LOGVV("INTF:   matched at %d", j);
-                    if (!dvmIsPublicMethod(clazz->vtable[j])) {
+                    if (!dvmIsAbstractMethod(clazz->vtable[j]) &&
+                        !dvmIsPublicMethod(clazz->vtable[j]))
+                    {
                         ALOGW("Implementation of %s.%s is not public",
                             clazz->descriptor, clazz->vtable[j]->name);
                         dvmThrowIllegalAccessError(
diff --git a/vm/oo/TypeCheck.cpp b/vm/oo/TypeCheck.cpp
index 1116d15..5228512 100644
--- a/vm/oo/TypeCheck.cpp
+++ b/vm/oo/TypeCheck.cpp
@@ -242,6 +242,7 @@
     const ClassObject* clazz)
 {
 #define ATOMIC_CACHE_CALC isInstanceof(instance, clazz)
+#define ATOMIC_CACHE_NULL_ALLOWED true
     return ATOMIC_CACHE_LOOKUP(gDvm.instanceofCache,
                 INSTANCEOF_CACHE_SIZE, instance, clazz);
 #undef ATOMIC_CACHE_CALC
diff --git a/vm/reflect/Annotation.cpp b/vm/reflect/Annotation.cpp
index 26dea75..7ef0bde 100644
--- a/vm/reflect/Annotation.cpp
+++ b/vm/reflect/Annotation.cpp
@@ -758,6 +758,7 @@
             ALOGE("Unable to resolve %s annotation class %d",
                 clazz->descriptor, typeIdx);
             assert(dvmCheckException(self));
+            dvmClearException(self);
             return NULL;
         }
     }
@@ -830,9 +831,6 @@
 {
     DexFile* pDexFile = clazz->pDvmDex->pDexFile;
     const DexAnnotationItem* pAnnoItem;
-    ArrayObject* annoArray;
-    int i, count;
-    u4 dstIndex;
 
     /* we need these later; make sure they're initialized */
     if (!dvmIsClassInitialized(gDvm.classOrgApacheHarmonyLangAnnotationAnnotationFactory))
@@ -841,38 +839,56 @@
         dvmInitClass(gDvm.classOrgApacheHarmonyLangAnnotationAnnotationMember);
 
     /* count up the number of visible elements */
-    for (i = count = 0; i < (int) pAnnoSet->size; i++) {
+    size_t count = 0;
+    for (size_t i = 0; i < pAnnoSet->size; ++i) {
         pAnnoItem = dexGetAnnotationItem(pDexFile, pAnnoSet, i);
-        if (pAnnoItem->visibility == visibility)
+        if (pAnnoItem->visibility == visibility) {
             count++;
+        }
     }
 
-    annoArray =
-        dvmAllocArrayByClass(gDvm.classJavaLangAnnotationAnnotationArray,
-                             count, ALLOC_DEFAULT);
-    if (annoArray == NULL)
+    ArrayObject* annoArray = dvmAllocArrayByClass(gDvm.classJavaLangAnnotationAnnotationArray,
+                                                  count, ALLOC_DEFAULT);
+    if (annoArray == NULL) {
         return NULL;
+    }
 
     /*
      * Generate Annotation objects.  We must put them into the array
      * immediately (or add them to the tracked ref table).
+     * We may not be able to resolve all annotations, and should just
+     * ignore those we can't.
      */
-    dstIndex = 0;
-    for (i = 0; i < (int) pAnnoSet->size; i++) {
+    u4 dstIndex = 0;
+    for (int i = 0; i < (int) pAnnoSet->size; i++) {
         pAnnoItem = dexGetAnnotationItem(pDexFile, pAnnoSet, i);
         if (pAnnoItem->visibility != visibility)
             continue;
         const u1* ptr = pAnnoItem->annotation;
         Object *anno = processEncodedAnnotation(clazz, &ptr);
-        if (anno == NULL) {
-            dvmReleaseTrackedAlloc((Object*) annoArray, NULL);
-            return NULL;
+        if (anno != NULL) {
+            dvmSetObjectArrayElement(annoArray, dstIndex, anno);
+            ++dstIndex;
         }
-        dvmSetObjectArrayElement(annoArray, dstIndex, anno);
-        ++dstIndex;
     }
 
-    return annoArray;
+    // If we got as many as we expected, we're done...
+    if (dstIndex == count) {
+        return annoArray;
+    }
+
+    // ...otherwise we need to trim the trailing nulls.
+    ArrayObject* trimmedArray = dvmAllocArrayByClass(gDvm.classJavaLangAnnotationAnnotationArray,
+                                                     dstIndex, ALLOC_DEFAULT);
+    if (trimmedArray == NULL) {
+        return NULL;
+    }
+    for (size_t i = 0; i < dstIndex; ++i) {
+        Object** src = (Object**)(void*) annoArray->contents;
+        dvmSetObjectArrayElement(trimmedArray, i, src[i]);
+    }
+    dvmReleaseTrackedAlloc((Object*) annoArray, NULL);
+    return trimmedArray;
 }
 
 /*
@@ -908,7 +924,12 @@
         if (annoClass == NULL) {
             annoClass = dvmResolveClass(clazz, typeIdx, true);
             if (annoClass == NULL) {
-                return NULL; // an exception is pending
+                ALOGE("Unable to resolve %s annotation class %d",
+                      clazz->descriptor, typeIdx);
+                Thread* self = dvmThreadSelf();
+                assert(dvmCheckException(self));
+                dvmClearException(self);
+                continue;
             }
         }
 
@@ -1941,17 +1962,22 @@
 static const DexAnnotationSetItem* findAnnotationSetForField(const Field* field)
 {
     ClassObject* clazz = field->clazz;
-    DexFile* pDexFile = clazz->pDvmDex->pDexFile;
-    const DexAnnotationsDirectoryItem* pAnnoDir;
-    const DexFieldAnnotationsItem* pFieldList;
-
-    pAnnoDir = getAnnoDirectory(pDexFile, clazz);
-    if (pAnnoDir == NULL)
+    DvmDex* pDvmDex = clazz->pDvmDex;
+    if (pDvmDex == NULL) {
         return NULL;
+    }
 
-    pFieldList = dexGetFieldAnnotations(pDexFile, pAnnoDir);
-    if (pFieldList == NULL)
+    DexFile* pDexFile = pDvmDex->pDexFile;
+
+    const DexAnnotationsDirectoryItem* pAnnoDir = getAnnoDirectory(pDexFile, clazz);
+    if (pAnnoDir == NULL) {
         return NULL;
+    }
+
+    const DexFieldAnnotationsItem* pFieldList = dexGetFieldAnnotations(pDexFile, pAnnoDir);
+    if (pFieldList == NULL) {
+        return NULL;
+    }
 
     /*
      * Run through the list and find a matching field.  We compare the
diff --git a/vm/reflect/Proxy.cpp b/vm/reflect/Proxy.cpp
index 02d43eb..57d32e7 100644
--- a/vm/reflect/Proxy.cpp
+++ b/vm/reflect/Proxy.cpp
@@ -66,7 +66,7 @@
 ClassObject* dvmGenerateProxyClass(StringObject* str, ArrayObject* interfaces,
     Object* loader)
 {
-    int result = -1;
+    ClassObject* result = NULL;
     ArrayObject* throws = NULL;
 
     char* nameStr = dvmCreateCstrFromString(str);
@@ -205,14 +205,13 @@
         goto bail;
     }
 
-    result = 0;
+    result = newClass;
 
 bail:
     free(nameStr);
-    if (result != 0) {
+    if (result == NULL) {
         /* must free innards explicitly if we didn't finish linking */
         dvmFreeClassInnards(newClass);
-        newClass = NULL;
         if (!dvmCheckException(dvmThreadSelf())) {
             /* throw something */
             dvmThrowRuntimeException(NULL);
@@ -223,7 +222,7 @@
     dvmReleaseTrackedAlloc((Object*) throws, NULL);
     dvmReleaseTrackedAlloc((Object*) newClass, NULL);
 
-    return newClass;
+    return result;
 }