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;
}