diff --git a/CleanSpec.mk b/CleanSpec.mk
index b84e1b6..b2474c2 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -44,6 +44,7 @@
 #$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
 #$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
 
+$(call add-clean-step, rm -rf $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/vm-tests-tf_intermediates)
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/CtsTestCoverage.mk b/CtsTestCoverage.mk
index 7053fea..f6cc568 100644
--- a/CtsTestCoverage.mk
+++ b/CtsTestCoverage.mk
@@ -19,22 +19,30 @@
 
 include cts/CtsTestCaseList.mk
 
-CTS_API_COVERAGE_EXE := $(HOST_OUT_EXECUTABLES)/cts-api-coverage
-DEXDEPS_EXE := $(HOST_OUT_EXECUTABLES)/dexdeps
+cts_api_coverage_exe := $(HOST_OUT_EXECUTABLES)/cts-api-coverage
+dexdeps_exe := $(HOST_OUT_EXECUTABLES)/dexdeps
 
-COVERAGE_OUT := $(HOST_OUT)/cts-api-coverage
-cts-test-coverage-report := $(COVERAGE_OUT)/test-coverage.html
-cts-verifier-coverage-report := $(COVERAGE_OUT)/verifier-coverage.html
+coverage_out := $(HOST_OUT)/cts-api-coverage
 
-CTS_API_COVERAGE_DEPENDENCIES := $(CTS_API_COVERAGE_EXE) $(DEXDEPS_EXE) $(ACP)
+api_text_description := $(SRC_API_DIR)/current.txt
+api_xml_description := $(coverage_out)/api.xml
+$(api_xml_description) : $(api_text_description) $(APICHECK)
+	$(hide) echo "Converting API file to XML: $@"
+	$(hide) mkdir -p $(coverage_out)
+	$(hide) $(APICHECK_COMMAND) -convert2xml $(api_text_description) $(api_xml_description)
 
-$(cts-test-coverage-report) : $(CTS_COVERAGE_TEST_CASE_LIST) $(CTS_API_COVERAGE_DEPENDENCIES)
+cts-test-coverage-report := $(coverage_out)/test-coverage.html
+cts-verifier-coverage-report := $(coverage_out)/verifier-coverage.html
+
+cts_api_coverage_dependencies := $(cts_api_coverage_exe) $(dexdeps_exe) $(api_xml_description) $(ACP)
+
+$(cts-test-coverage-report) : $(CTS_COVERAGE_TEST_CASE_LIST) $(cts_api_coverage_dependencies)
 	$(call generate-coverage-report,"CTS Tests API Coverage Report",\
-			$(CTS_COVERAGE_TEST_CASE_LIST),html,test-coverage.html)
+			$(CTS_COVERAGE_TEST_CASE_LIST),cts-test-apks,html,test-coverage.html)
 
-$(cts-verifier-coverage-report) : CtsVerifier $(CTS_API_COVERAGE_DEPENDENCIES)
+$(cts-verifier-coverage-report) : CtsVerifier $(cts_api_coverage_dependencies)
 	$(call generate-coverage-report,"CTS Verifier API Coverage Report",\
-			CtsVerifier,html,verifier-coverage.html)
+			CtsVerifier,cts-verifier-apks,html,verifier-coverage.html)
 
 .PHONY: cts-test-coverage
 cts-test-coverage : $(cts-test-coverage-report)
@@ -51,15 +59,16 @@
 # Arguments;
 #  1 - Name of the report printed out on the screen
 #  2 - Name of APK packages that will be scanned to generate the report
-#  3 - Format of the report
-#  4 - Output file name of the report
+#  3 - Name of variable to hold the calculated paths of the APKs
+#  4 - Format of the report
+#  5 - Output file name of the report
 define generate-coverage-report
-	$(foreach testcase,$(2),$(eval $(call add-testcase-apk,$(testcase))))
-	$(hide) mkdir -p $(COVERAGE_OUT)
-	$(hide) $(CTS_API_COVERAGE_EXE) -d $(DEXDEPS_EXE) -f $(3) -o $(COVERAGE_OUT)/$(4) $(TEST_APKS)
-	$(hide) echo $(1): file://$(ANDROID_BUILD_TOP)/$(COVERAGE_OUT)/$(4)
+	$(foreach testcase,$(2),$(eval $(call add-testcase-apk,$(3),$(testcase))))
+	$(hide) mkdir -p $(coverage_out)
+	$(hide) $(cts_api_coverage_exe) -d $(dexdeps_exe) -a $(api_xml_description) -f $(4) -o $(coverage_out)/$(5) $($(3))
+	$(hide) echo $(1): file://$(ANDROID_BUILD_TOP)/$(coverage_out)/$(5)
 endef
 
 define add-testcase-apk
-	TEST_APKS += $(call intermediates-dir-for,APPS,$(1))/package.apk
+	$(1) += $(call intermediates-dir-for,APPS,$(2))/package.apk
 endef
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index bbf7eaf..337ed2e 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -25,7 +25,7 @@
 
 LOCAL_PACKAGE_NAME := CtsVerifier
 
-LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni libaudioquality
+LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni libaudioquality libcameraanalyzer
 
 LOCAL_SDK_VERSION := current
 
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 07e474e..2036e2d 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -24,6 +24,7 @@
 
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     
@@ -186,6 +187,15 @@
 
         <service android:name=".audioquality.ExperimentService" />
 
+        <activity android:name=".camera.analyzer.CameraAnalyzerActivity"
+                android:label="@string/camera_analyzer">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_camera" />
+        </activity>
+
    </application>
 
 </manifest> 
diff --git a/apps/CtsVerifier/include/colorchecker/colorchecker.h b/apps/CtsVerifier/include/colorchecker/colorchecker.h
new file mode 100644
index 0000000..5409b04
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/colorchecker.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef COLORCHECKER_H
+#define COLORCHECKER_H
+
+/** Detects the 6x4 Xrite ColorChecker Classic pattern in the input image,
+ *   and calculates the average color value per patch.
+ *
+ *  All squares in the colorchecker pattern have to be fully visible,
+ *  and the whole pattern should fill at least 1/3 of the image
+ *  width. The pattern cannot be facing away from the camera at a very
+ *  large angle (>45 degrees). If multiple 6x4 grids can be found, the
+ *  one that is most front-facing will be returned.
+ *
+ *  The average color is returned as a floating-point value per
+ *  channel, linearized by an inverse gamma transform and normalized
+ *  to 0-1 (255 = 1). The linearization is only approximate.
+ *
+ *  @param inputImage Source image to detect the pattern in. Assumed
+ *                    to be a 3-channel interleaved image. Row-major
+ *  @param width Width of input image
+ *  @param height Height of input image
+ *  @param patchColors Output 6x4 3-channel image of average patch
+ *                     values.  Allocated by caller. Pass in NULL if
+ *                     the average values aren't needed.
+ *  @param outputImage Resized inputImage with overlaid grid detection
+ *                     diagnostics. Image width is approximately 160
+ *                     pixels. Pass in NULL if the diagnostic image
+ *                     isn't needed.
+ *  @param outputWidth Actual width of outputImage.
+ *  @param outputHeight Actual height of outputImage.
+ *
+ *  @return true if a grid was found, false otherwise. If false, the
+ *          input variables are unchanged.
+ */
+bool findColorChecker(const unsigned char *image,
+                      int width,
+                      int rowSpan,
+                      int height,
+                      float *patchColors,
+                      unsigned char **outputImage,
+                      int *outputWidth,
+                      int *outputHeight);
+
+
+#endif
diff --git a/apps/CtsVerifier/jni/audioquality/Android.mk b/apps/CtsVerifier/jni/audioquality/Android.mk
index 565cec2..8e827f7 100644
--- a/apps/CtsVerifier/jni/audioquality/Android.mk
+++ b/apps/CtsVerifier/jni/audioquality/Android.mk
@@ -20,7 +20,7 @@
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_PRELINK_MODULE := false
+
 
 LOCAL_MODULE    := libaudioquality
 LOCAL_SRC_FILES := Fft.cpp Window.cpp GlitchTest.cpp MeasureRms.cpp \
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
new file mode 100644
index 0000000..ccc0998
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2011 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libcameraanalyzer
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := com_android_cts_verifier_camera_analyzer_ColorChecker.cpp
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker $(JNI_H_INCLUDE)
+
+LOCAL_STATIC_LIBRARIES := libcolorchecker
+LOCAL_SHARED_LIBRARIES := libjnigraphics \
+                          libstlport \
+                          libcutils \
+                          libutils
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.cpp
new file mode 100644
index 0000000..4d247ab
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.cpp
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2011 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 "com_android_cts_verifier_camera_analyzer_ColorChecker.h"
+
+#include "utils/Log.h"
+#include "android/bitmap.h"
+#include "colorchecker.h"
+
+jboolean Java_com_android_cts_verifier_camera_analyzer_ColorChecker_findNative(
+    JNIEnv*      env,
+    jobject      thiz,
+    jobject      inputBitmap) {
+
+    // Verify that we can handle the input bitmap
+    AndroidBitmapInfo inputInfo;
+    AndroidBitmap_getInfo(env, inputBitmap, &inputInfo);
+    if (inputInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
+        inputInfo.format != ANDROID_BITMAP_FORMAT_RGB_565) {
+        LOGE("Only RGBA_8888 and RGB_565 bitmaps are supported, was given type %d.", inputInfo.format);
+        return JNI_FALSE;
+    }
+
+    // Get some references to the fields and class type of ColorChecker
+    jclass thizCls = env->GetObjectClass(thiz);
+    jfieldID patchId = env->GetFieldID(thizCls, "mPatchValues", "[F");
+    jfieldID outputId = env->GetFieldID(thizCls, "mDebugOutput", "Landroid/graphics/Bitmap;");
+    jfloatArray patchValues = (jfloatArray)env->GetObjectField(thiz, patchId);
+
+    // Get raw inputs and outputs ready
+
+    uint8_t *inputBuffer;
+    int result = AndroidBitmap_lockPixels(
+        env,
+        inputBitmap,
+        reinterpret_cast<void**>(&inputBuffer) );
+
+    if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+        LOGE("Unable to lock input bitmap");
+        return JNI_FALSE;
+    }
+
+    float *patchRawArray = env->GetFloatArrayElements(patchValues,
+                                                      NULL);
+
+    uint8_t *outputImage = NULL;
+    int outputWidth, outputHeight;
+
+    // Find the color checker
+    bool success;
+    uint8_t *inputBufferRGBA = NULL;
+    int inputStride;
+    bool freeInputRGBA = false;
+    switch (inputInfo.format) {
+        case ANDROID_BITMAP_FORMAT_RGB_565: {
+            // First convert to RGBA_8888
+            inputBufferRGBA = new uint8_t[inputInfo.width *
+                                          inputInfo.height *
+                                          4];
+            inputStride = inputInfo.width * 4;
+            uint8_t *outP = inputBufferRGBA;
+            for (int y = 0; y < inputInfo.height; y++ ) {
+                uint16_t *inP = (uint16_t*)(&inputBuffer[y * inputInfo.stride]);
+                for (int x = 0; x < inputInfo.width; x++) {
+                    *(outP++) = ( ((*inP) >> 0) & 0x001F) << 3;
+                    *(outP++) = ( ((*inP) >> 5) & 0x003F) << 2;
+                    *(outP++) = ( ((*inP) >> 11) & 0x001F) << 3;
+                    outP++;
+                    inP++;
+                }
+            }
+            freeInputRGBA = true;
+            break;
+        }
+        case ANDROID_BITMAP_FORMAT_RGBA_8888:
+            // Already in RGBA
+            inputBufferRGBA = inputBuffer;
+            inputStride = inputInfo.stride;
+            break;
+    }
+
+    success = findColorChecker(inputBufferRGBA,
+                               inputInfo.width,
+                               inputStride,
+                               inputInfo.height,
+                               patchRawArray,
+                               &outputImage,
+                               &outputWidth,
+                               &outputHeight);
+
+    // Clean up raw inputs/outputs
+    env->ReleaseFloatArrayElements(patchValues, patchRawArray, 0);
+    result = AndroidBitmap_unlockPixels(env, inputBitmap);
+    if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+        LOGE("Unable to unlock input bitmap");
+        return JNI_FALSE;
+    }
+
+    if (freeInputRGBA) {
+        delete inputBufferRGBA;
+    }
+
+    // Create debug bitmap from output image data
+    if (outputImage != NULL) {
+        // Get method handles, create inputs to createBitmap
+        jclass bitmapClass =
+                env->FindClass("android/graphics/Bitmap");
+        jclass bitmapConfigClass =
+                env->FindClass("android/graphics/Bitmap$Config");
+
+        jmethodID createBitmap = env->GetStaticMethodID(
+            bitmapClass, "createBitmap",
+            "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
+
+        jmethodID getConfig = env->GetStaticMethodID(
+            bitmapConfigClass, "valueOf",
+            "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;");
+
+        // Create bitmap config and bitmap
+        jstring bitmapConfigValue = env->NewStringUTF("ARGB_8888");
+        jobject rgbaConfig = env->CallStaticObjectMethod(bitmapConfigClass,
+                                                         getConfig,
+                                                         bitmapConfigValue);
+        jobject outputBitmap = env->CallStaticObjectMethod(bitmapClass,
+                                                           createBitmap,
+                                                           outputWidth,
+                                                           outputHeight,
+                                                           rgbaConfig);
+        // Copy output image into it
+        uint8_t *outputBuffer;
+        int result = AndroidBitmap_lockPixels(
+            env,
+            outputBitmap,
+            reinterpret_cast<void**>(&outputBuffer) );
+
+        if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+            LOGE("Unable to lock output bitmap");
+            return JNI_FALSE;
+        }
+
+        memcpy(outputBuffer, outputImage, outputWidth * outputHeight * 4);
+
+        result = AndroidBitmap_unlockPixels(env, outputBitmap);
+        if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+            LOGE("Unable to unlock output bitmap");
+            return JNI_FALSE;
+        }
+
+        // Write new Bitmap reference into mDebugOutput class member
+        env->SetObjectField(thiz, outputId, outputBitmap);
+
+        delete outputImage;
+    }
+    if (!success) return JNI_FALSE;
+
+    return JNI_TRUE;
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.h
new file mode 100644
index 0000000..a9b4487
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef JNI_CAMERAANALYZER_COLORCHECKER_H
+#define JNI_CAMERAANALYZER_COLORCHECKER_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jboolean JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorChecker_findNative(
+    JNIEnv *env,
+    jobject thiz,
+    jobject inputBitmap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* JNI_CAMERAANALYZER_COLORCHECKER_H */
diff --git a/apps/CtsVerifier/jni/verifier/Android.mk b/apps/CtsVerifier/jni/verifier/Android.mk
index 98a4678..da4687d 100644
--- a/apps/CtsVerifier/jni/verifier/Android.mk
+++ b/apps/CtsVerifier/jni/verifier/Android.mk
@@ -21,7 +21,7 @@
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_PRELINK_MODULE := false
+
 
 LOCAL_SRC_FILES := \
 		CtsVerifierJniOnLoad.cpp \
diff --git a/apps/CtsVerifier/jni/verifier/com_android_cts_verifier_os_FileUtils.cpp b/apps/CtsVerifier/jni/verifier/com_android_cts_verifier_os_FileUtils.cpp
index 14e58eb..9c69f1a 100644
--- a/apps/CtsVerifier/jni/verifier/com_android_cts_verifier_os_FileUtils.cpp
+++ b/apps/CtsVerifier/jni/verifier/com_android_cts_verifier_os_FileUtils.cpp
@@ -21,7 +21,6 @@
 #include <grp.h>
 #include <pwd.h>
 
-static jclass gFileStatusClass;
 static jfieldID gFileStatusDevFieldID;
 static jfieldID gFileStatusInoFieldID;
 static jfieldID gFileStatusModeFieldID;
@@ -95,19 +94,19 @@
 {
     jclass clazz = env->FindClass("com/android/cts/verifier/os/FileUtils");
 
-    gFileStatusClass = env->FindClass("com/android/cts/verifier/os/FileUtils$FileStatus");
-    gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
-    gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
-    gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
-    gFileStatusNlinkFieldID = env->GetFieldID(gFileStatusClass, "nlink", "I");
-    gFileStatusUidFieldID = env->GetFieldID(gFileStatusClass, "uid", "I");
-    gFileStatusGidFieldID = env->GetFieldID(gFileStatusClass, "gid", "I");
-    gFileStatusSizeFieldID = env->GetFieldID(gFileStatusClass, "size", "J");
-    gFileStatusBlksizeFieldID = env->GetFieldID(gFileStatusClass, "blksize", "I");
-    gFileStatusBlocksFieldID = env->GetFieldID(gFileStatusClass, "blocks", "J");
-    gFileStatusAtimeFieldID = env->GetFieldID(gFileStatusClass, "atime", "J");
-    gFileStatusMtimeFieldID = env->GetFieldID(gFileStatusClass, "mtime", "J");
-    gFileStatusCtimeFieldID = env->GetFieldID(gFileStatusClass, "ctime", "J");
+    jclass fileStatusClass = env->FindClass("com/android/cts/verifier/os/FileUtils$FileStatus");
+    gFileStatusDevFieldID = env->GetFieldID(fileStatusClass, "dev", "I");
+    gFileStatusInoFieldID = env->GetFieldID(fileStatusClass, "ino", "I");
+    gFileStatusModeFieldID = env->GetFieldID(fileStatusClass, "mode", "I");
+    gFileStatusNlinkFieldID = env->GetFieldID(fileStatusClass, "nlink", "I");
+    gFileStatusUidFieldID = env->GetFieldID(fileStatusClass, "uid", "I");
+    gFileStatusGidFieldID = env->GetFieldID(fileStatusClass, "gid", "I");
+    gFileStatusSizeFieldID = env->GetFieldID(fileStatusClass, "size", "J");
+    gFileStatusBlksizeFieldID = env->GetFieldID(fileStatusClass, "blksize", "I");
+    gFileStatusBlocksFieldID = env->GetFieldID(fileStatusClass, "blocks", "J");
+    gFileStatusAtimeFieldID = env->GetFieldID(fileStatusClass, "atime", "J");
+    gFileStatusMtimeFieldID = env->GetFieldID(fileStatusClass, "mtime", "J");
+    gFileStatusCtimeFieldID = env->GetFieldID(fileStatusClass, "ctime", "J");
 
     return env->RegisterNatives(clazz, gMethods, 
             sizeof(gMethods) / sizeof(JNINativeMethod)); 
diff --git a/apps/CtsVerifier/lib/Android.mk b/apps/CtsVerifier/lib/Android.mk
new file mode 100644
index 0000000..56a3fa8
--- /dev/null
+++ b/apps/CtsVerifier/lib/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2011 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 $(call all-subdir-makefiles)
diff --git a/apps/CtsVerifier/lib/colorchecker/Android.mk b/apps/CtsVerifier/lib/colorchecker/Android.mk
new file mode 100644
index 0000000..97f0089
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2011 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+#####################
+# Build image analysis library
+
+include $(CLEAR_VARS)
+include external/stlport/libstlport.mk
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := libcolorchecker
+
+LOCAL_SRC_FILES += colorchecker.cpp
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker
+LOCAL_SHARED_LIBRARIES := libstlport \
+                          libcutils \
+                          libutils
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp b/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp
new file mode 100644
index 0000000..1e0ae97
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp
@@ -0,0 +1,714 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+//#define LOG_NDEBUG 0
+#include <utils/Log.h>
+#include <utils/Timers.h>
+
+#include "colorchecker.h"
+#include "grouping.h"
+#include <string>
+#include <vector>
+#include <set>
+#include <algorithm>
+#include <cmath>
+
+const int totalChannels = 4; // Input image channel count
+const int colorChannels = 3; // Input image color channel count
+const float gammaCorrection = 2.2; // Assumed gamma curve on input
+const int thresholdSq = 675; // Threshold on pixel difference to be considered
+                             // part of the same patch
+
+class PixelId {
+  public:
+    int id;
+    const unsigned char *p;
+
+    PixelId(): id(0), p(NULL) {}
+
+    bool operator!=(const PixelId &other) const {
+        int dR = ((int)p[0] - other.p[0]) * ((int)p[0] - other.p[0]);
+        int dG = ((int)p[1] - other.p[1]) * ((int)p[1] - other.p[1]);
+        int dB = ((int)p[2] - other.p[2]) * ((int)p[2] - other.p[2]);
+        int distSq = dR + dG + dB;
+        if (distSq > thresholdSq) return true;
+        else return false;
+    }
+};
+
+class ImageField: public Field<PixelId> {
+  public:
+    ImageField(int width, int height, const unsigned char *data):
+            mWidth(width), mHeight(height), pData(data) {
+    }
+
+    PixelId operator() (int y, int x) const {
+        PixelId pId;
+        pId.p = pData + (y * mWidth + x ) * totalChannels;
+        if (mask.size() != 0) {
+            pId.id = mask[y][x];
+        }
+        return pId;
+    }
+
+    int getWidth() const { return mWidth; }
+    int getHeight() const { return mHeight; }
+  private:
+    int mWidth;
+    int mHeight;
+    const unsigned char *pData;
+};
+
+class PixelGroup {
+  public:
+    PixelGroup(int id, const ImageField *src):
+        mId(id),
+        mMinX(1e7),
+        mMinY(1e7),
+        mMaxX(0),
+        mMaxY(0),
+        mArea(0),
+        mSrc(src),
+        mRNeighbor(NULL),
+        mDNeighbor(NULL),
+        mLNeighbor(NULL),
+        mUNeighbor(NULL) {
+        mSum[0] = 0;
+        mSum[1] = 0;
+        mSum[2] = 0;
+    }
+
+    struct IdCompare {
+        bool operator() (const PixelGroup* l, const PixelGroup* r) const {
+            return l->getId() < r->getId();
+        }
+    };
+
+    void growGroup(int x, int y) {
+        if (x < mMinX) mMinX = x;
+        if (x > mMaxX) mMaxX = x;
+        if (y < mMinY) mMinY = y;
+        if (y > mMaxY) mMaxY = y;
+        mArea++;
+        const unsigned char *p = (*mSrc)(y,x).p;
+        mSum[0] += p[0];
+        mSum[1] += p[1];
+        mSum[2] += p[2];
+    }
+
+    int getId() const {
+        return mId;
+    }
+
+    int getArea() const {
+        return mArea;
+    }
+
+    int getBoundArea() const {
+        return (mMaxX - mMinX) * (mMaxY - mMinY);
+    }
+
+    float getApproxAspectRatio() const {
+        return ((float)(mMaxY - mMinY)) / (mMaxX - mMinX);
+    }
+
+    void getApproxCenter(int *x, int *y) const {
+        *x = (mMaxX + mMinX)/2;
+        *y = (mMaxY + mMinY)/2;
+    }
+
+    void getBoundingBox(int *x1, int *y1, int *x2, int *y2) const {
+        *x1 = mMinX;
+        *x2 = mMaxX;
+        *y1 = mMinY;
+        *y2 = mMaxY;
+    }
+
+    void getAvgValue(unsigned char *p) const {
+        p[0] = mSum[0] / mArea;
+        p[1] = mSum[1] / mArea;
+        p[2] = mSum[2] / mArea;
+    }
+
+    bool operator<(const PixelGroup &other) const {
+        return mArea < other.getArea();
+    }
+
+    typedef std::set<PixelGroup*, PixelGroup::IdCompare> IdSet;
+    typedef std::set<PixelGroup*, PixelGroup::IdCompare>::iterator IdSetIter;
+
+    void findNeighbors(IdSet &candidates) {
+        int cX, cY;
+        getApproxCenter(&cX, &cY);
+        int rDistSq = 1e9; // Larger than any reasonable image distance
+        int dDistSq = rDistSq;
+
+        for (IdSetIter neighbor = candidates.begin();
+             neighbor != candidates.end();
+             neighbor++) {
+            if (*neighbor == this) continue;
+            int nX, nY;
+            (*neighbor)->getApproxCenter(&nX, &nY);
+            // 'right' means slope between (-1/3, 1/3), positive X change
+            if ( (nX - cX) > 0 ) {
+                float slope = ((float)(nY - cY)) / (nX - cX);
+                if (slope > -0.33 && slope < 0.33) {
+                    int distSq = (nX - cX) * (nX - cX) + (nY - cY) * (nY - cY);
+                    if (distSq < rDistSq) {
+                        setRNeighbor(*neighbor);
+                        rDistSq = distSq;
+                    }
+                }
+            }
+            // 'down' means inv slope between (-1/3, 1/3), positive Y change
+            if ( (nY - cY) > 0) {
+                float invSlope = ((float)(nX - cX)) / (nY - cY);
+                if (invSlope > -0.33 && invSlope < 0.33) {
+                    int distSq = (nX - cX) * (nX - cX) + (nY - cY) * (nY - cY);
+                    if (distSq < dDistSq) {
+                        setDNeighbor(*neighbor);
+                        dDistSq = distSq;
+                    }
+                }
+            }
+        }
+        // Do reverse links if possible
+        if (getRNeighbor() != NULL) {
+            getRNeighbor()->setLNeighbor(this);
+        }
+        if (getDNeighbor() != NULL) {
+            getDNeighbor()->setUNeighbor(this);
+        }
+
+    }
+
+    void setRNeighbor(PixelGroup *rNeighbor) {
+        mRNeighbor = rNeighbor;
+    }
+
+    PixelGroup* getRNeighbor(int distance = 1)  {
+        PixelGroup *current = this;
+        for (int i=0; i < distance; i++) {
+            if (current != NULL) {
+                current = current->mRNeighbor;
+            } else break;
+        }
+        return current;
+    }
+
+    void setDNeighbor(PixelGroup *dNeighbor) {
+        mDNeighbor = dNeighbor;
+    }
+
+    PixelGroup* getDNeighbor(int distance = 1) {
+        PixelGroup *current = this;
+        for (int i=0; i < distance; i++) {
+            if (current != NULL) {
+                current = current->mDNeighbor;
+            } else break;
+        }
+        return current;
+    }
+
+    void setLNeighbor(PixelGroup *lNeighbor) {
+        mLNeighbor = lNeighbor;
+    }
+
+    PixelGroup* getLNeighbor(int distance = 1) {
+        PixelGroup *current = this;
+        for (int i=0; i < distance; i++) {
+            if (current != NULL) {
+                current = current->mLNeighbor;
+            } else break;
+        }
+        return current;
+    }
+
+    void setUNeighbor(PixelGroup *uNeighbor) {
+        mUNeighbor = uNeighbor;
+    }
+
+    PixelGroup* getUNeighbor(int distance = 1) {
+        PixelGroup *current = this;
+        for (int i=0; i < distance; i++) {
+            if (current != NULL) {
+                current = current->mUNeighbor;
+            } else break;
+        }
+        return current;
+    }
+
+    float distanceSqTo(const PixelGroup* other) {
+        int mX, mY;
+        getApproxCenter(&mX, &mY);
+        int oX, oY;
+        other->getApproxCenter(&oX, &oY);
+        int dx = (oX - mX);
+        int dy = (oY - mY);
+        return dx * dx + dy * dy;
+    }
+
+    float distanceTo(const PixelGroup* other) {
+        return sqrt( distanceSqTo(other) );
+    }
+
+  private:
+    int mId;
+    int mMinX, mMinY;
+    int mMaxX, mMaxY;
+    int mArea;
+    int mSum[3];
+    const ImageField *mSrc;
+
+    PixelGroup *mRNeighbor;
+    PixelGroup *mDNeighbor;
+    PixelGroup *mLNeighbor;
+    PixelGroup *mUNeighbor;
+};
+
+/* Scales input down by factor of outScale to output. Assumes input size is
+ * exactly output size times scale */
+void downsample(const unsigned char *input,
+                unsigned char *output,
+                int rowSpan,
+                int outWidth,
+                int outHeight,
+                int outScale) {
+    for (int oY = 0, iY = 0; oY < outHeight; oY++, iY += outScale) {
+        for (int oX = 0, iX = 0; oX < outWidth; oX++, iX += outScale) {
+            short out[3] = {0,0,0};
+            const unsigned char *in = input + iY * rowSpan + iX * totalChannels;
+            for (int j = 0; j < outScale; j++) {
+                for (int k = 0; k < outScale; k++) {
+                    for (int i = 0; i < colorChannels; i++) {
+                        out[i] += in[i];
+                    }
+                    in += totalChannels;
+                }
+                in += rowSpan - outScale * totalChannels;
+            }
+            output[0] = out[0] / (outScale * outScale);
+            output[1] = out[1] / (outScale * outScale);
+            output[2] = out[2] / (outScale * outScale);
+            output += totalChannels;
+        }
+    }
+}
+
+void drawLine(unsigned char *image,
+              int rowSpan,
+              int x0, int y0,
+              int x1, int y1,
+              int r, int g, int b) {
+    if ((x0 == x1) && (y0 == y1)) {
+        unsigned char *p = &image[(y0 * rowSpan + x0) * totalChannels];
+        if (r != -1) p[0] = r;
+        if (g != -1) p[1] = g;
+        if (b != -1) p[2] = b;
+        return;
+    }
+    if ( std::abs(x1-x0) > std::abs(y1-y0) ) {
+        if (x0 > x1) {
+            std::swap(x0, x1);
+            std::swap(y0, y1);
+        }
+        float slope = (float)(y1 - y0) / (x1 - x0);
+        for (int x = x0; x <= x1; x++) {
+            int y = y0 + slope * (x - x0);
+            unsigned char *p = &image[(y * rowSpan + x) * totalChannels];
+            if (r != -1) p[0] = r;
+            if (g != -1) p[1] = g;
+            if (b != -1) p[2] = b;
+        }
+    } else {
+        if (y0 > y1) {
+            std::swap(x0, x1);
+            std::swap(y0, y1);
+        }
+        float invSlope = (float)(x1 - x0) / (y1 - y0);
+        for (int y = y0; y <= y1; y++) {
+            int x = x0 + invSlope * (y - y0);
+            unsigned char *p = &image[(y*rowSpan + x) * totalChannels];
+            if (r != -1) p[0] = r;
+            if (g != -1) p[1] = g;
+            if (b != -1) p[2] = b;
+        }
+    }
+
+}
+bool findColorChecker(const unsigned char *image,
+                      int width,
+                      int rowSpan,
+                      int height,
+                      float *patchColors,
+                      unsigned char **outputImage,
+                      int *outputWidth,
+                      int *outputHeight) {
+    int64_t startTime = systemTime();
+
+    const int outTargetWidth = 160;
+    const int outScale = width / outTargetWidth;
+    const int outWidth = width / outScale;
+    const int outHeight = height / outScale;
+    LOGV("Debug image dimensions: %d, %d", outWidth, outHeight);
+
+    unsigned char *output = new unsigned char[outWidth * outHeight * totalChannels];
+
+    unsigned char *outP;
+    unsigned char *inP;
+
+    // First step, downsample for speed/noise reduction
+    downsample(image, output, rowSpan, outWidth, outHeight, outScale);
+
+    // Find connected components (groups)
+    ImageField outField(outWidth, outHeight, output);
+    Grouping(&outField);
+
+    // Calculate component bounds and areas
+    std::vector<PixelGroup> groups;
+    groups.reserve(outField.id_no);
+    for (int i = 0; i < outField.id_no; i++) {
+        groups.push_back(PixelGroup(i + 1, &outField));
+    }
+
+    inP = output;
+    for (int y = 0; y < outHeight; y++) {
+        for (int x = 0; x < outWidth; x++) {
+            groups[ outField(y, x).id - 1].growGroup(x, y);
+        }
+    }
+
+    // Filter out groups that are too small, too large, or have too
+    // non-square aspect ratio
+    PixelGroup::IdSet candidateGroups;
+
+    // Maximum/minimum width assuming pattern is fully visible and >
+    // 1/3 the image in width
+    const int maxPatchWidth = outWidth / 6;
+    const int minPatchWidth = outWidth / 3 / 7;
+    const int maxPatchArea = maxPatchWidth * maxPatchWidth;
+    const int minPatchArea = minPatchWidth * minPatchWidth;
+    // Assuming nearly front-on view of target, so aspect ratio should
+    // be quite close to square
+    const float maxAspectRatio = 5.f / 4.f;
+    const float minAspectRatio = 4.f / 5.f;
+    for (int i = 0; i < (int)groups.size(); i++) {
+        float aspect = groups[i].getApproxAspectRatio();
+        if (aspect < minAspectRatio || aspect > maxAspectRatio) continue;
+        // Check both boundary box area, and actual pixel count - they
+        // should both be within bounds for a roughly square patch.
+        int boundArea = groups[i].getBoundArea();
+        if (boundArea < minPatchArea || boundArea > maxPatchArea) continue;
+        int area = groups[i].getArea();
+        if (area < minPatchArea || area > maxPatchArea) continue;
+        candidateGroups.insert(&groups[i]);
+    }
+
+    // Find neighbors for candidate groups. O(n^2), but not many
+    // candidates to go through
+    for (PixelGroup::IdSetIter group = candidateGroups.begin();
+         group != candidateGroups.end();
+         group++) {
+        (*group)->findNeighbors(candidateGroups);
+    }
+
+    // Try to find a plausible 6x4 grid by taking each pixel group as
+    // the candidate top-left corner and try to build a grid from
+    // it. Assumes no missing patches.
+    float bestError = -1;
+    std::vector<int> bestGrid(6 * 4,0);
+    for (PixelGroup::IdSetIter group = candidateGroups.begin();
+         group != candidateGroups.end();
+         group++) {
+        int dex, dey; (*group)->getApproxCenter(&dex, &dey);
+        std::vector<int> grid(6 * 4, 0);
+        PixelGroup *tl = *group;
+        PixelGroup *bl, *tr, *br;
+
+        // Find the bottom-left and top-right corners
+        if ( (bl = tl->getDNeighbor(3)) == NULL ||
+             (tr = tl->getRNeighbor(5)) == NULL ) continue;
+        LOGV("Candidate at %d, %d", dex, dey);
+        LOGV("  Got BL and TR");
+
+        // Find the bottom-right corner
+        if ( tr->getDNeighbor(3) == NULL ) {
+            LOGV("  No BR from TR");
+            continue;
+        }
+        br = tr->getDNeighbor(3);
+        if ( br != bl->getRNeighbor(5) ) {
+            LOGV("  BR from TR and from BL don't agree");
+            continue;
+        }
+        br->getApproxCenter(&dex, &dey);
+        LOGV("  Got BR corner at %d, %d", dex, dey);
+
+        // Check that matching grid edge lengths are about the same
+        float gridTopWidth = tl->distanceTo(tr);
+        float gridBotWidth = bl->distanceTo(br);
+
+        if (gridTopWidth / gridBotWidth < minAspectRatio ||
+            gridTopWidth / gridBotWidth > maxAspectRatio) continue;
+        LOGV("  Got reasonable widths: %f %f", gridTopWidth, gridBotWidth);
+
+        float gridLeftWidth = tl->distanceTo(bl);
+        float gridRightWidth = tr->distanceTo(br);
+
+        if (gridLeftWidth / gridRightWidth < minAspectRatio ||
+            gridLeftWidth / gridRightWidth > maxAspectRatio) continue;
+        LOGV("  Got reasonable heights: %f %f", gridLeftWidth, gridRightWidth);
+
+        // Calculate average grid spacing
+        float gridAvgXGap = (gridTopWidth + gridBotWidth) / 2 / 5;
+        float gridAvgYGap = (gridLeftWidth + gridRightWidth) / 2 / 3;
+
+        // Calculate total error between average grid spacing and
+        // actual spacing Uses difference in expected squared distance
+        // and actual squared distance
+        float error = 0;
+        for (int x = 0; x < 6; x++) {
+            for (int y = 0; y < 4; y++) {
+                PixelGroup *node;
+                node = tl->getRNeighbor(x)->getDNeighbor(y);
+                if (node == NULL) {
+                    error += outWidth * outWidth;
+                    grid[y * 6 + x] = 0;
+                } else {
+                    grid[y * 6 + x] = node->getId();
+                    if (node == tl) continue;
+                    float dist = tl->distanceSqTo(node);
+                    float expXDist = (gridAvgXGap * x);
+                    float expYDist = (gridAvgYGap * y);
+                    float expDist =  expXDist * expXDist + expYDist * expYDist;
+                    error += fabs(dist - expDist);
+                }
+            }
+        }
+        if (bestError == -1 ||
+            bestError > error) {
+            bestGrid = grid;
+            bestError = error;
+            LOGV("  Best candidate, error %f", error);
+        }
+    }
+
+    // Check if a grid wasn't found
+    if (bestError == -1) {
+        LOGV("No color checker found!");
+    }
+
+    // Make sure black square is in bottom-right corner
+    if (bestError != -1) {
+        unsigned char tlValues[3];
+        unsigned char brValues[3];
+        int tlId = bestGrid[0];
+        int brId = bestGrid[23];
+
+        groups[tlId - 1].getAvgValue(tlValues);
+        groups[brId - 1].getAvgValue(brValues);
+
+        int tlSum = tlValues[0] + tlValues[1] + tlValues[2];
+        int brSum = brValues[0] + brValues[1] + brValues[2];
+        if (brSum > tlSum) {
+            // Grid is upside down, need to flip!
+            LOGV("Flipping grid to put grayscale ramp at bottom");
+            bestGrid = std::vector<int>(bestGrid.rbegin(), bestGrid.rend());
+        }
+    }
+
+    // Output average patch colors if requested
+    if (bestError != -1 && patchColors != NULL) {
+        for (int n = 0; n < 6 * 4 * colorChannels; n++) patchColors[n] = -1.f;
+
+        // Scan over original input image for grid regions, degamma, average
+        for (int px = 0; px < 6; px++) {
+            for (int py = 0; py < 4; py++) {
+                int id = bestGrid[py * 6 + px];
+                if (id == 0) continue;
+
+                PixelGroup &patch = groups[id - 1];
+                int startX, startY;
+                int endX, endY;
+                patch.getBoundingBox(&startX, &startY, &endX, &endY);
+
+                float sum[colorChannels] = {0.f};
+                int count = 0;
+                for (int y = startY; y <= endY; y++) {
+                    for (int x = startX; x < endX; x++) {
+                        if (outField(y,x).id != id) continue;
+                        for (int iY = y * outScale;
+                             iY < (y + 1) * outScale;
+                             iY++) {
+                            const unsigned char *inP = image +
+                                    (iY * rowSpan)
+                                    + (x * outScale * totalChannels);
+                            for (int iX = 0; iX < outScale; iX++) {
+                                for (int c = 0; c < colorChannels; c++) {
+                                    // Convert to float and normalize
+                                    float v = inP[c] / 255.f;
+                                    // Gamma correct to get back to
+                                    // roughly linear data
+                                    v = pow(v, gammaCorrection);
+                                    // Sum it up
+                                    sum[c] += v;
+                                }
+                                count++;
+                                inP += totalChannels;
+                            }
+                        }
+                    }
+                }
+                for (int c = 0 ; c < colorChannels; c++) {
+                    patchColors[ (py * 6  + px) * colorChannels + c ] =
+                            sum[c] / count;
+                }
+            }
+        }
+        // Print out patch colors
+        IF_LOGV() {
+            for (int y = 0; y < 4; y++) {
+                char tmpMsg[256];
+                int cnt = 0;
+                cnt = snprintf(tmpMsg, 256, "%02d:", y + 1);
+                for (int x = 0; x < 6; x++) {
+                    int id = bestGrid[y * 6 + x];
+                    if (id != 0) {
+                        float *p = &patchColors[ (y * 6 + x) * colorChannels];
+                        cnt += snprintf(tmpMsg + cnt, 256 - cnt,
+                                        "\t(%.3f,%.3f,%.3f)", p[0], p[1], p[2]);
+                    } else {
+                        cnt += snprintf(tmpMsg + cnt, 256 - cnt,
+                                        "\t(xxx,xxx,xxx)");
+                    }
+                }
+                LOGV("%s", tmpMsg);
+            }
+        }
+    }
+
+    // Draw output if requested
+    if (outputImage != NULL) {
+        *outputImage = output;
+        *outputWidth = outWidth;
+        *outputHeight = outHeight;
+
+        // Draw all candidate group bounds
+        for (PixelGroup::IdSetIter group = candidateGroups.begin();
+             group != candidateGroups.end();
+             group++) {
+
+            int x,y;
+            (*group)->getApproxCenter(&x, &y);
+
+            // Draw candidate bounding box
+            int x0, y0, x1, y1;
+            (*group)->getBoundingBox(&x0, &y0, &x1, &y1);
+            drawLine(output, outWidth,
+                     x0, y0, x1, y0,
+                     255, 0, 0);
+            drawLine(output, outWidth,
+                     x1, y0, x1, y1,
+                     255, 0, 0);
+            drawLine(output, outWidth,
+                     x1, y1, x0, y1,
+                     255, 0, 0);
+            drawLine(output, outWidth,
+                     x0, y1, x0, y0,
+                     255, 0, 0);
+
+            // Draw lines between neighbors
+            // Red for to-right and to-below of me connections
+            const PixelGroup *neighbor;
+            if ( (neighbor = (*group)->getRNeighbor()) != NULL) {
+                int nX, nY;
+                neighbor->getApproxCenter(&nX, &nY);
+                drawLine(output,
+                         outWidth,
+                         x, y, nX, nY,
+                         255, -1, -1);
+            }
+            if ( (neighbor = (*group)->getDNeighbor()) != NULL) {
+                int nX, nY;
+                neighbor->getApproxCenter(&nX, &nY);
+                drawLine(output,
+                         outWidth,
+                         x, y, nX, nY,
+                         255, -1, -1);
+            }
+            // Blue for to-left or to-above of me connections
+            if ( (neighbor = (*group)->getLNeighbor()) != NULL) {
+                int nX, nY;
+                neighbor->getApproxCenter(&nX, &nY);
+                drawLine(output,
+                         outWidth,
+                         x, y, nX, nY,
+                         -1, -1, 255);
+            }
+            if ( (neighbor = (*group)->getUNeighbor()) != NULL) {
+                int nX, nY;
+                neighbor->getApproxCenter(&nX, &nY);
+                drawLine(output,
+                         outWidth,
+                         x, y, nX, nY,
+                         -1, -1, 255);
+            }
+        }
+
+        // Mark found grid patch pixels
+        if (bestError != -1) {
+            for (int x=0; x < 6; x++) {
+                for (int y =0; y < 4; y++) {
+                    int id = bestGrid[y * 6 + x];
+                    if (id != 0) {
+                        int x0, y0, x1, y1;
+                        groups[id - 1].getBoundingBox(&x0, &y0, &x1, &y1);
+                        // Fill patch pixels with blue
+                        for (int px = x0; px < x1; px++) {
+                            for (int py = y0; py < y1; py++) {
+                                if (outField(py,px).id != id) continue;
+                                unsigned char *p =
+                                        &output[(py * outWidth + px)
+                                                * totalChannels];
+                                p[0] = 0;
+                                p[1] = 0;
+                                p[2] = 255;
+
+                            }
+                        }
+                        drawLine(output, outWidth,
+                                 x0, y0, x1, y1,
+                                 0, 255, 0);
+                        drawLine(output, outWidth,
+                                 x0, y1, x0, y1,
+                                 0, 255, 0);
+                    }
+                }
+            }
+        }
+
+    } else {
+        delete output;
+    }
+
+    int64_t endTime = systemTime();
+    LOGV("Process time: %f ms",
+         (endTime - startTime) / 1000000.);
+
+    if (bestError == -1) return false;
+
+    return true;
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/grouping.h b/apps/CtsVerifier/lib/colorchecker/grouping.h
new file mode 100755
index 0000000..3125f55
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/grouping.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2011 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 <vector>
+#include <utility>
+
+#ifndef FILTERPACK_CALIBRATION_GROUPING_H
+#define FILTERPACK_CALIBRATION_GROUPING_H
+
+// To use the Grouping function, derive one class from Field.
+// Field class provides the interface for the Grouping function.
+// FF_ID is the pixel class used to compare values,
+//  != operator must be defined in this class
+//  region number of the pixel
+
+typedef std::vector <std::vector<int> > MASK;
+typedef std::pair<int, int> POS;
+// FF_ID needs to implement the operator !=
+// bool  operator != (const FF_ID &id)
+template <class FF_ID>
+class Field {
+  public:
+    int id_no;
+    MASK mask;
+    virtual FF_ID operator () (int y, int x) const =0 ;
+    virtual int getWidth()  const = 0;
+    virtual int getHeight()  const= 0;
+    virtual ~Field() {}
+};
+
+template < class FF_ID>
+void FloodFill(int sx,
+               int sy,
+               int id_no,
+               const FF_ID &id,
+               Field<FF_ID> *pField,
+               POS *new_pos) {
+    std::vector<POS> stack;
+    stack.push_back(POS(sx,sy));
+    while (stack.size() > 0) {
+        sx = stack.back().first;
+        sy = stack.back().second;
+        stack.pop_back();
+
+        // fill the current line
+        int x;
+        for (x = sx-1; x >= 0; x--)
+        {
+            if (pField->mask[sy][x]!=0) break;
+            if (id != (*pField)(sy,x)) {
+                new_pos->first = x;
+                new_pos->second =sy;
+                break;
+            }
+            pField->mask[sy][x] = id_no;
+        }
+        int startx = x;
+        for (x = sx;x < pField->getWidth(); x++) {
+            if (pField->mask[sy][x]!=0) break;
+            if (id != (*pField)(sy,x)) {
+                new_pos->first = x;
+                new_pos->second =sy;
+                break;
+            }
+            pField->mask[sy][x] = id_no;
+        }
+        int endx = x;
+        if (endx >= pField->getWidth()) endx = pField->getWidth() - 1;
+        if (startx < 0) startx = 0;
+        // push the adjacent spans to the stack
+        if (sy>0) {
+            int bNew = true;
+            for (x = endx; x >= startx; x--) {
+                if (pField->mask[sy-1][x] != 0 || id != (*pField)(sy-1,x) ) {
+                    bNew = true;
+                    continue;
+                }
+                if (bNew) {
+                    stack.push_back( POS(x, sy-1));
+                    bNew = false;
+                }
+            }
+        }
+        if (sy < (pField->getHeight() - 1)) {
+            int bNew = true;
+            for (x = endx; x >= startx; x--) {
+                if (pField->mask[sy+1][x]!=0 || id != (*pField)(sy+1,x)) {
+                    bNew = true;
+                    continue;
+                }
+                if (bNew) {
+                    stack.push_back( POS(x, sy+1));
+                    bNew = false;
+                }
+            }
+        }
+    }
+}
+
+// Group the pixels in Field based on the FF_ID != operator.
+// All pixels will be labeled from 1. The total number of unique groups(regions)
+// is (pField->id_no - 1) after the call
+// The labeasl of the pixels are stored in the mask member of Field.
+
+template <class FF_ID>
+void Grouping(Field <FF_ID> *pField) {
+    int width = pField->getWidth();
+    int height = pField->getHeight();
+    pField->mask =  MASK(height, std::vector<int> (width, 0) );
+
+    FF_ID id;
+    pField->id_no = 1;
+    int sx = width / 2, sy = height / 2;
+    POS new_pos(-1,-1);
+    while (1) {
+        id = (*pField)(sy,sx);
+        int id_no = pField->id_no;
+        new_pos.first = -1;
+        new_pos.second = -1;
+        FloodFill(sx, sy, id_no, id, pField, &new_pos);
+        if (new_pos.first < 0) // no new position found, during the flood fill
+        {
+            const int kNumOfRetries = 10;
+            // try 10 times for the new unfilled position
+            for (int i = 0; i < kNumOfRetries; i++) {
+                sx = rand() % width;
+                sy = rand() % height;
+                if (pField->mask[sy][sx] == 0) {
+                    new_pos.first = sx;
+                    new_pos.second = sy;
+                    break;
+                }
+            }
+            if (new_pos.first < 0) { // still failed, search the whole image
+                for (int y = 0; y < height && new_pos.first < 0; y++)
+                    for (int x = 0; x < width; x++) {
+                        if (pField->mask[y][x] == 0) {
+                            new_pos.first = x;
+                            new_pos.second = y;
+                            break;
+                        }
+                    }
+            }
+            if (new_pos.first < 0) break; // finished
+        }
+        sx = new_pos.first;
+        sy = new_pos.second;
+        pField->id_no++;
+    }
+}
+
+#endif
diff --git a/apps/CtsVerifier/res/layout/ca_main.xml b/apps/CtsVerifier/res/layout/ca_main.xml
new file mode 100644
index 0000000..98ec049
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ca_main.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical" android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+
+  <Button android:id="@+id/runbutton" android:layout_width="fill_parent"
+    android:layout_height="wrap_content" android:text="@string/ca_run_label" />
+
+  <TextView android:id="@+id/resulttext" android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/ca_result_label"
+            android:textSize="15sp" />
+
+  <LinearLayout android:orientation="horizontal"
+    android:layout_width="fill_parent" android:layout_height="wrap_content">
+
+    <SurfaceView android:id="@+id/cameraview" android:layout_height="match_parent"
+      android:layout_width="match_parent"
+      android:layout_weight="1" />
+
+    <ImageView android:id="@+id/resultview" android:layout_height="match_parent"
+      android:layout_width="match_parent"
+      android:layout_weight="1" />
+
+  </LinearLayout>
+</LinearLayout>
+
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 7aa7458..7291d7c 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -29,6 +29,7 @@
     <!-- Strings for TestListActivity -->
     <string name="test_list_title">Manual Test List</string>
     <string name="test_category_audio">Audio</string>
+    <string name="test_category_camera">Camera</string>
     <string name="test_category_device_admin">Device Administration</string>
     <string name="test_category_networking">Networking</string>
     <string name="test_category_sensors">Sensors</string>
@@ -233,6 +234,7 @@
     <string name="aq_level_report">RMS = %1$.0f, target = %2$.0f\nTolerance = %3$.1f%%\nDuration = %4$.1fs</string>
     <string name="aq_spectrum_report_error">Cannot perform test.\nCheck volume is sufficiently high?</string>
     <string name="aq_spectrum_report_normal">RMS deviation = %1$.2f\nMax allowed deviation = %2$.1f</string>
+
     <string name="aq_cold_latency_report">Latency = %1$dms, maximum allowed = %2$dms</string>
     <string name="aq_warm_latency_report_error">RMS = %1$.0f, target = %2$.0f</string>
     <string name="aq_warm_latency_report_normal">Latency = %1$dms</string>
@@ -245,4 +247,8 @@
     <string name="aq_recording_error">Error reading data from AudioRecord instance</string>
     <string name="aq_exception_error">Exception thrown during test: %1$s</string>
 
+    <!-- Strings for Camera Analyzer -->
+    <string name="camera_analyzer">Camera Analyzer</string>
+    <string name="ca_run_label">Find color checker</string>
+    <string name="ca_result_label">Patch values will be here</string>
 </resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
new file mode 100644
index 0000000..b50dd9e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+package com.android.cts.verifier.camera.analyzer;
+
+import com.android.cts.verifier.R;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.hardware.Camera;
+import android.os.Bundle;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.io.IOException;
+
+public class CameraAnalyzerActivity extends Activity {
+
+    Bitmap mInputImage;
+    TextView mResultText;
+    SurfaceView mCameraView;
+    ImageView mResultView;
+    Camera mCamera;
+    boolean mProcessingPicture = false;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ca_main);
+
+        findViewById(R.id.runbutton).setOnClickListener(mRunListener);
+
+        mCameraView = (SurfaceView)findViewById(R.id.cameraview);
+        mResultView = (ImageView)findViewById(R.id.resultview);
+        mResultText = (TextView)findViewById(R.id.resulttext);
+        mCameraView.getHolder().addCallback(mSurfaceChangeListener);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mCamera = Camera.open(0);
+        Camera.Parameters params = mCamera.getParameters();
+        params.setPictureFormat(ImageFormat.JPEG);
+        mCamera.setParameters(params);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mCamera.release();
+    }
+
+    private View.OnClickListener mRunListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (!mProcessingPicture) {
+                mCamera.takePicture(null, null, null, mJpegListener);
+                mProcessingPicture = true;
+            }
+        }
+    };
+
+    private Camera.PictureCallback mJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            mCamera.startPreview();
+            mInputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+            ColorChecker checker = new ColorChecker(mInputImage);
+            mResultView.setImageBitmap(checker.getDebugOutput());
+            if (checker.isValid()) {
+                String patchValueTxt = new String();
+                for (int y = 0; y < 4; y++) {
+                    for (int x = 0; x < 6; x++) {
+                        patchValueTxt +=
+                                String.format("[ %.3f, %.3f, %.3f] ",
+                                              checker.getPatchValue(x,y,0),
+                                              checker.getPatchValue(x,y,1),
+                                              checker.getPatchValue(x,y,2));
+                    }
+                    patchValueTxt += "\n";
+                }
+                mResultText.setText(patchValueTxt);
+            } else {
+                mResultText.setText("Can't find color checker!");
+            }
+            mProcessingPicture = false;
+        }
+    };
+
+    private SurfaceHolder.Callback mSurfaceChangeListener =
+            new SurfaceHolder.Callback() {
+        @Override
+        public void surfaceChanged(SurfaceHolder holder,
+                                   int format,
+                                   int width,
+                                   int height) {
+
+        }
+
+        @Override
+        public void surfaceCreated(SurfaceHolder holder) {
+            try {
+                mCamera.setPreviewDisplay(mCameraView.getHolder());
+            } catch (IOException e) {
+                throw new RuntimeException("Unable to connect camera to display: " + e);
+            }
+            mCamera.startPreview();
+        }
+
+        @Override
+        public void surfaceDestroyed(SurfaceHolder holder) {
+
+        }
+
+    };
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorChecker.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorChecker.java
new file mode 100644
index 0000000..c9df24a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorChecker.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package com.android.cts.verifier.camera.analyzer;
+
+import android.graphics.Bitmap;
+
+/** The ColorChecker class is used to locate a Xrite Classic Color Checker grid
+ * pattern in an image, and return the average value of each color patch.
+ *
+ * The pattern is a 6x4 grid of square color patches. The detection routine
+ * assumes the pattern is placed roughly facing the camera, with the long size
+ * roughly horizontal. It doesn't matter whether the pattern is upside down or
+ * not - the returned array will have the grayscale squares of the pattern on
+ * the bottom row.
+ */
+class ColorChecker {
+
+    private float[] mPatchValues;
+    private Bitmap mDebugOutput;
+    private boolean mSuccess = false;
+
+    /** Construct a ColorChecker from a source Bitmap.
+     *
+     * @param source The source image to scan through for the 6x4 Xrite Classic
+     *        Color Checker pattern.
+     */
+    public ColorChecker(Bitmap source) {
+        mPatchValues = new float[6 * 4 * 3];
+        mSuccess =  findNative(source);
+     }
+
+    /** Returns whether the ColorChecker pattern was found in the source bitmap
+     *
+     * @return true if the pattern was found in the source Bitmap. false
+     *         otherwise.
+     */
+    public boolean isValid() {
+        return mSuccess;
+    }
+
+    /** Returns patch RGB triplet for patch (x, y), or null if the pattern wasn't
+     * found.
+     *
+     * @param x Column of the patch
+     * @param y Row of the patch
+     * @return A 3-entry float array representing the R, G, and B values of the
+     *         patch in roughly linear luminance, mapped to the 0-1 range.
+     */
+    public float[] getPatchRGB(int x, int y) {
+        if (!mSuccess) throw new RuntimeException("No color checker found!");
+        float[] rgb = {
+            mPatchValues[(y * 6 + x) * 3 + 0],
+            mPatchValues[(y * 6 + x) * 3 + 1],
+            mPatchValues[(y * 6 + x) * 3 + 2]
+        };
+        return rgb;
+    }
+
+    /** Returns patch (x, y) color channel c.
+     *
+     * @param x Column of the patch
+     * @param y Row of the patch
+     * @param c Color channel of the patch (0 = R, 1 = G, 2 = B)
+     * @return The float value for that color channel in roughly linear
+     *         luminance, mapped to the 0-1 range.
+     */
+    public float getPatchValue(int x, int y, int c) {
+        if (!mSuccess) throw new RuntimeException("No color checker found!");
+        return mPatchValues[(y * 6 + x) * 3 + c];
+    }
+
+    /** Returns debug Bitmap image showing detected candidate patches and the
+     * grid if it was found. Valid even if the pattern wasn't found. Candiate
+     * patches will have red bounding boxes. In addition, patches that are part
+     * of the color checker pattern are have a green diagonal, and all their
+     * member pixels are colored in solid blue.
+     *
+     * @return A low-resolution version of the source Bitmap with overlaid
+     *         detection results.
+     */
+    public Bitmap getDebugOutput() {
+        return mDebugOutput;
+    }
+
+    native boolean findNative(Bitmap input);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
index a9fd515..8543890 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
@@ -129,11 +129,6 @@
             new Feature("android.hardware.faketouch", true),
     };
 
-    public static final Feature[] ALL_HONEYCOMB_MR1_FEATURES = {
-            new Feature("android.hardware.usb.host", false),
-            new Feature("android.hardware.usb.accessory", false),
-    };
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -174,9 +169,6 @@
         if (apiVersion >= Build.VERSION_CODES.HONEYCOMB) {
             Collections.addAll(features, ALL_HONEYCOMB_FEATURES);
         }
-        if (apiVersion >= Build.VERSION_CODES.HONEYCOMB_MR1) {
-            Collections.addAll(features, ALL_HONEYCOMB_MR1_FEATURES);
-        }
         for (Feature f : features) {
             HashMap<String, Object> row = new HashMap<String, Object>();
             listViewData.add(row);
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 85e10cd..2d95899 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -655,6 +655,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.webkit.cts.WebDriverStubActivity"
+            android:label="WebDriverStubActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.app.cts.ChildActivity"
                         android:label="ChildActivity" />
 
@@ -945,6 +953,13 @@
         <activity android:name="android.app.cts.ActivityManagerMemoryClassTestActivity"
                 android:process=":memoryclass" />
 
+        <service android:name="android.speech.tts.cts.StubTextToSpeechService">
+            <intent-filter>
+                <action android:name="android.intent.action.TTS_SERVICE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </service>
+
     </application>
 
     <!--Test for PackageManager, please put this at the very beginning-->
diff --git a/tests/SignatureTest/Android.mk b/tests/SignatureTest/Android.mk
index 4166002..3ebab34 100644
--- a/tests/SignatureTest/Android.mk
+++ b/tests/SignatureTest/Android.mk
@@ -31,7 +31,7 @@
 # To be passed in on command line
 CTS_API_VERSION ?= current
 
-android_api_description := $(SRC_API_DIR)/$(CTS_API_VERSION).xml
+android_api_description := $(SRC_API_DIR)/$(CTS_API_VERSION).txt
 
 # Can't call local-intermediates-dir directly here because we have to
 # include BUILD_PACAKGE first.  Can't include BUILD_PACKAGE first
@@ -67,9 +67,15 @@
 # sure the generated resources rule depend on it, we can ensure that
 # the proper version of the api resource gets generated.
 $(api_ver_file):
-	@rm -f $(api_ver_path)/api_ver_is_*
+	$(hide) rm -f $(api_ver_path)/api_ver_is_*
 	$(hide) touch $@
 
+android_api_xml_description := $(intermediates.COMMON)/api.xml
+$(android_api_xml_description): PRIVATE_INPUT_FILE := $(android_api_description)
+$(android_api_xml_description): $(android_api_description) $(APICHECK)
+	$(hide) echo "Convert api file to xml: $@"
+	$(hide) $(APICHECK_COMMAND) -convert2xml $(PRIVATE_INPUT_FILE) $@
+
 static_res_deps := $(call find-subdir-assets,$(LOCAL_PATH)/res)
 $(copied_res_stamp): PRIVATE_PATH := $(LOCAL_PATH)
 $(copied_res_stamp): PRIVATE_MODULE := $(LOCAL_MODULE)
@@ -77,11 +83,11 @@
 $(copied_res_stamp): FAKE_RESOURCE_DIR := $(dir $(fake_resource_check))
 $(copied_res_stamp): FAKE_RESOURCE_CHECK := $(fake_resource_check)
 $(copied_res_stamp): $(foreach res,$(static_res_deps),$(LOCAL_PATH)/res/${res}) | $(ACP)
-	@echo "Copy resources: $(PRIVATE_MODULE)"
-	@rm -f $@
-	@rm -rf $(PRIVATE_RES_DIR)
-	@mkdir -p $(PRIVATE_RES_DIR)
-	@if [ ! -f $(FAKE_RESOURCE_CHECK) ]; \
+	$(hide) echo "Copy resources: $(PRIVATE_MODULE)"
+	$(hide) rm -f $@
+	$(hide) rm -rf $(PRIVATE_RES_DIR)
+	$(hide) mkdir -p $(PRIVATE_RES_DIR)
+	$(hide) if [ ! -f $(FAKE_RESOURCE_CHECK) ]; \
 	  then mkdir -p $(FAKE_RESOURCE_DIR); \
 	  touch $(FAKE_RESOURCE_CHECK); \
 	fi
@@ -94,11 +100,11 @@
 $(generated_res_stamp): PRIVATE_MODULE := $(LOCAL_MODULE)
 $(generated_res_stamp): PRIVATE_RES_DIR := $(signature_res_dir)
 $(generated_res_stamp): $(api_ver_file)
-$(generated_res_stamp): $(copied_res_stamp) $(android_api_description)
-	@echo "Copy generated resources: $(PRIVATE_MODULE)"
-	@rm -f $@
+$(generated_res_stamp): $(copied_res_stamp) $(android_api_xml_description)
+	$(hide) echo "Copy generated resources: $(PRIVATE_MODULE)"
+	$(hide) rm -f $@
 	$(hide) python cts/tools/utils/android_api_description_splitter.py \
-		$(android_api_description) $(PRIVATE_RES_DIR) package
+		$(android_api_xml_description) $(PRIVATE_RES_DIR) package
 	$(hide) touch $@
 
 $(R_file_stamp): $(generated_res_stamp) $(copied_res_stamp)
diff --git a/tests/assets/webkit/form_page.html b/tests/assets/webkit/form_page.html
new file mode 100644
index 0000000..a61e619
--- /dev/null
+++ b/tests/assets/webkit/form_page.html
@@ -0,0 +1,90 @@
+<!-- Copyright (C) 2011 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.
+-->
+
+<html>
+<head>
+    <title>Form Test Page</title>
+</head>
+<body>
+  <a id="tagA">Tag A</a>
+  <a name="text"></a>
+  <a id=someTextId>Some text&nbsp;</a>
+  <a id=nestedLinkId>Is not nested, and is not unique!</a>
+  <a class="divClass">Outter text</a>
+  <a id="outter" name="foo">Foo</a>
+
+  <div id=divId name="firstDiv">A div
+    <a id=nestedLinkId class="divClass" name="nestedLink">Nested text</a>
+    <a id="n1" name="linkn1">a nested link</a>
+    <a id="inner" href="test_hello_world.html" name="foo">Foo</a>
+    <span id="n1" name="spann1"></span>
+    <a name=nested>Nested text</a>
+  </div>
+  <p id="spaces">     </p>
+  <p id="empty"></p>
+  <a name=foo href="foo" id="linkWithEqualsSign">Link=equalssign</a>
+  <p id="self-closed" />Here is some content that should not be in the previous p tag
+
+  <p class=" spaceAround ">Spaced out</p>
+
+  <a name="text" id="emptyLink"> </a>
+  <p id="spaces">     </p>
+  <p id="empty"></p>
+  <p id="self-closed"/>
+
+  <div>
+  <a id="id1" href="#">Foo</a>
+  <ul id="id2" />
+  <span id="id3"/>
+  <p id="id3">A paragraph</p>
+  </div>
+
+  <input name="inputDisabled" id="inputDisabled" disabled="disabled"> </input>
+  <span id="my_span">
+    <div>first_div</div>
+    <div>second_div</div>
+    <span>first_span</span>
+    <span>second_span</span>
+    <a id="Foo">Foo</a>
+  </span>
+
+  <select name="selectomatic">
+          <option id="one" selected="selected">One</option>
+          <option id="two">Two</option>
+          <option id="four">Four</option>
+          <option>Still learning how to count, apparently</option>
+  </select>
+
+  <select name="multi" id="multi" multiple="multiple">
+         <option id="eggs" selected="selected">Eggs</option>
+         <option id="ham" >Ham</option>
+         <option selected="selected">Sausages</option>
+         <option>Onion gravy</option>
+  </select>
+
+  <input type="radio" id="cheese" name="snack" value="cheese"/>Cheese<br/>
+  <input type="radio" id="peas" name="snack" value="peas"/>Peas<br/>
+  <input type="radio" id="cheese_and_peas" name="snack" value="cheese and peas" checked/>Cheese and peas<br/>
+  <input type="radio" id="nothing" name="snack" value="nowt" disabled="disabled"/>Not a sausage
+
+  <form action="test_hello_world.html" method="get">
+    <input type="hidden" name="hidden" value="fromage" id="fromage" />
+    Here's a checkbox: <input type="checkbox" id="checky" name="checky" value="furrfu"/><br/>
+    <input type="text" value="enter text here" name="textinput" style="background-color:red;width:100px;height:50px"></input>
+    <input type="text" id="typehere"/>
+    <a style="position:absolute;left:200px;top:250px">B</a>
+  </form>
+</body>
+</html>
diff --git a/tests/assets/webkit/test_jsInterface.html b/tests/assets/webkit/test_jsInterface.html
index b7d7150..662dfe0 100644
--- a/tests/assets/webkit/test_jsInterface.html
+++ b/tests/assets/webkit/test_jsInterface.html
@@ -15,11 +15,7 @@
 
 <html>
     <title>Original title</title>
-    <script type="text/javascript">
-        /* This function is invoked by the activity */
-        function changeTitle(title) { document.title = title; }
-    </script>
     <!-- Calls into the javascript interface for the activity -->
-    <body onload='window.dummy.onLoad(document.title)'>
+    <body onload='window.dummy.provideResult(document.title)'>
     </body>
 </html>
diff --git a/tests/core/Android.mk b/tests/core/Android.mk
index 7a2a708..e9c9793 100644
--- a/tests/core/Android.mk
+++ b/tests/core/Android.mk
@@ -14,6 +14,4 @@
 
 LOCAL_PATH:= $(call my-dir)
 
-BUILD_CTSCORE_PACKAGE:=$(LOCAL_PATH)/ctscore.mk
-
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/core/ctscore.mk b/tests/core/ctscore.mk
index 337b3f5..11fc253 100644
--- a/tests/core/ctscore.mk
+++ b/tests/core/ctscore.mk
@@ -39,16 +39,14 @@
 $(PACKAGE_RESOURCES): PRIVATE_PRIVATE_KEY := $(private_key)
 $(PACKAGE_RESOURCES): PRIVATE_CERTIFICATE := $(certificate)
 $(PACKAGE_RESOURCES): $(LOCAL_BUILT_MODULE) $(CORETESTS_INTERMEDIATES)/javalib.jar
+# Remove .class files from javalib.jar, we only want the resources
 	@echo "Add resources to package ($@)"
 	@rm -rf $(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses
-# javalib.jar should only contain .dex files, but the harmony tests also include
-# some .class files, so get rid of them
 	$(call unzip-jar-files,$(PRIVATE_CORETESTS_INTERMEDIATES_COMMON)/javalib.jar,\
 		$(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses)
 	@find $(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses -type f -name "*.class" -delete
-	@rm -f $(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses/classes.dex
-	@cp $< $@
-	@jar uf $@ -C $(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses .
+	$(hide) cp $< $@
+	$(hide) jar uf $@ -C $(PRIVATE_INTERMEDIATES_COMMON)/ctsclasses .
 	$(sign-package)
 	$(align-package)
 	$(hide) cp $@ $<
diff --git a/tests/core/dom/Android.mk b/tests/core/dom/Android.mk
deleted file mode 100644
index 69d4af3..0000000
--- a/tests/core/dom/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# DOM Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,../../../../libcore/dom/src/test/java) \
-	$(call all-java-files-under,../../../../libcore/junit/src/test/java/junit) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java/)
-
-LOCAL_PACKAGE_NAME := android.core.tests.dom
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/dom/AndroidManifest.xml b/tests/core/dom/AndroidManifest.xml
deleted file mode 100644
index 8fa00e3..0000000
--- a/tests/core/dom/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.dom">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/core/libcore/Android.mk b/tests/core/libcore/Android.mk
new file mode 100644
index 0000000..5a897eb
--- /dev/null
+++ b/tests/core/libcore/Android.mk
@@ -0,0 +1,19 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+BUILD_CTSCORE_PACKAGE:=$(LOCAL_PATH)/../ctscore.mk
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/core/libcore/com/Android.mk b/tests/core/libcore/com/Android.mk
new file mode 100644
index 0000000..91a5da0
--- /dev/null
+++ b/tests/core/libcore/com/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.com
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/com/AndroidManifest.xml b/tests/core/libcore/com/AndroidManifest.xml
new file mode 100644
index 0000000..4e37ef4
--- /dev/null
+++ b/tests/core/libcore/com/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.com">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/libcore/dalvik/Android.mk b/tests/core/libcore/dalvik/Android.mk
new file mode 100644
index 0000000..45f6e7e
--- /dev/null
+++ b/tests/core/libcore/dalvik/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.dalvik
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/dalvik/AndroidManifest.xml b/tests/core/libcore/dalvik/AndroidManifest.xml
new file mode 100644
index 0000000..6def32c
--- /dev/null
+++ b/tests/core/libcore/dalvik/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.dalvik">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/libcore/libcore/Android.mk b/tests/core/libcore/libcore/Android.mk
new file mode 100644
index 0000000..97e32bc
--- /dev/null
+++ b/tests/core/libcore/libcore/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.libcore
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/libcore/AndroidManifest.xml b/tests/core/libcore/libcore/AndroidManifest.xml
new file mode 100644
index 0000000..e4a5d1e
--- /dev/null
+++ b/tests/core/libcore/libcore/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.libcore">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/libcore/org/Android.mk b/tests/core/libcore/org/Android.mk
new file mode 100644
index 0000000..8fad8de
--- /dev/null
+++ b/tests/core/libcore/org/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.org
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/org/AndroidManifest.xml b/tests/core/libcore/org/AndroidManifest.xml
new file mode 100644
index 0000000..d5b77bd
--- /dev/null
+++ b/tests/core/libcore/org/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.org">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/libcore/src/Dummy.java b/tests/core/libcore/src/Dummy.java
new file mode 100644
index 0000000..cfe0c81
--- /dev/null
+++ b/tests/core/libcore/src/Dummy.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+/**
+ * We really just want the core-tests classes from the static java
+ * library, but the build system currently needs at least one input
+ * file, not just becuase its a sanity check, but because the static
+ * class files and resources are included in the output of the local
+ * java compilation.
+ */
+public final class Dummy {}
diff --git a/tests/core/libcore/sun/Android.mk b/tests/core/libcore/sun/Android.mk
new file mode 100644
index 0000000..5fc0c48
--- /dev/null
+++ b/tests/core/libcore/sun/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.sun
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/sun/AndroidManifest.xml b/tests/core/libcore/sun/AndroidManifest.xml
new file mode 100644
index 0000000..cc1a853
--- /dev/null
+++ b/tests/core/libcore/sun/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.sun">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/libcore/tests/Android.mk b/tests/core/libcore/tests/Android.mk
new file mode 100644
index 0000000..bcb6628
--- /dev/null
+++ b/tests/core/libcore/tests/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := ../src/Dummy.java
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.tests
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/tests/AndroidManifest.xml b/tests/core/libcore/tests/AndroidManifest.xml
new file mode 100644
index 0000000..02f8b4a
--- /dev/null
+++ b/tests/core/libcore/tests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.tests">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/core/luni-io/Android.mk b/tests/core/luni-io/Android.mk
deleted file mode 100644
index 6669c6a..0000000
--- a/tests/core/luni-io/Android.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# Luni-Io Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/java/io) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/libcore/java/io) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java/) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/pkg1) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/pkg2) \
-	../../../../libcore/luni/src/test/java/tests/luni/AllTestsIo.java
-
-LOCAL_PACKAGE_NAME := android.core.tests.luni.io
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/luni-io/AndroidManifest.xml b/tests/core/luni-io/AndroidManifest.xml
deleted file mode 100644
index 1224aa5..0000000
--- a/tests/core/luni-io/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.luni.io">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/core/luni-lang/Android.mk b/tests/core/luni-lang/Android.mk
deleted file mode 100644
index c3528ec..0000000
--- a/tests/core/luni-lang/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# Luni-Lang Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/java/lang) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java/) \
-	../../../../libcore/luni/src/test/java/tests/luni/AllTestsLang.java
-
-LOCAL_PACKAGE_NAME := android.core.tests.luni.lang
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/luni-lang/AndroidManifest.xml b/tests/core/luni-lang/AndroidManifest.xml
deleted file mode 100644
index cb79f5f..0000000
--- a/tests/core/luni-lang/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.luni.lang">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/core/luni-net/Android.mk b/tests/core/luni-net/Android.mk
deleted file mode 100644
index 8a6508c..0000000
--- a/tests/core/luni-net/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# Luni-Net Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/libcore/java/net) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/http) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/https) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java/) \
-	../../../../libcore/luni/src/test/java/tests/luni/AllTestsNet.java
-
-LOCAL_PACKAGE_NAME := android.core.tests.luni.net
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/luni-net/AndroidManifest.xml b/tests/core/luni-net/AndroidManifest.xml
deleted file mode 100644
index ca0d17a..0000000
--- a/tests/core/luni-net/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.luni.net">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/core/luni-util/Android.mk b/tests/core/luni-util/Android.mk
deleted file mode 100644
index 5468c17..0000000
--- a/tests/core/luni-util/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# Luni-Util Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,../../../../libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/util) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/java/util) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java/) \
-	../../../../libcore/luni/src/test/java/tests/luni/AllTestsUtil.java
-
-LOCAL_PACKAGE_NAME := android.core.tests.luni.util
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/luni-util/AndroidManifest.xml b/tests/core/luni-util/AndroidManifest.xml
deleted file mode 100644
index 8b4daad..0000000
--- a/tests/core/luni-util/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.luni.util">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/core/runner/src/android/test/InstrumentationCtsTestRunner.java b/tests/core/runner/src/android/test/InstrumentationCtsTestRunner.java
index 5aa2c3b..cdba560 100644
--- a/tests/core/runner/src/android/test/InstrumentationCtsTestRunner.java
+++ b/tests/core/runner/src/android/test/InstrumentationCtsTestRunner.java
@@ -80,8 +80,6 @@
         System.setProperty("user.home", cacheDir.getAbsolutePath());
         System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());
         System.setProperty("user.dir", cacheDir.getAbsolutePath());
-        System.setProperty("javax.net.ssl.trustStore",
-                "/etc/security/cacerts.bks");
 
         TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
 
diff --git a/tests/core/xml/Android.mk b/tests/core/xml/Android.mk
deleted file mode 100644
index 0f643a0..0000000
--- a/tests/core/xml/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (C) 2009 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-ifeq ($(BUILD_CTSCORE_PACKAGE),)
-    $(error BUILD_CTSCORE_PACKAGE must be defined)
-endif
-
-#
-# Xml Tests
-##########################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,../../../../libcore/xml/src/test/java) \
-	$(call all-java-files-under,../../../../libcore/dom/src/test) \
-	$(call all-java-files-under,../../../../libcore/junit/src/test/java/junit) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/javax/xml/parsers) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/org/xml/sax) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/api/org/xml/sax/support) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/org/w3c/dom) \
-	$(call all-java-files-under,../../../../libcore/luni/src/test/java/tests/xml) \
-	$(call all-java-files-under,../../../../libcore/support/src/test/java)
-
-LOCAL_PACKAGE_NAME := android.core.tests.xml
-
-# for java.* javax.* support classes in libcore/support/src/test/java
-LOCAL_DX_FLAGS := --core-library
-
-include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/xml/AndroidManifest.xml b/tests/core/xml/AndroidManifest.xml
deleted file mode 100644
index 0f6085e..0000000
--- a/tests/core/xml/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.core.tests.xml">
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="android.core.tests.runner"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tests/expectations/knownfailures-3.0_r1.txt b/tests/expectations/knownfailures-3.0_r1.txt
index 3cb0815..fb797c2 100644
--- a/tests/expectations/knownfailures-3.0_r1.txt
+++ b/tests/expectations/knownfailures-3.0_r1.txt
@@ -1,13 +1,4 @@
 [
-/* Framework problems. */
-{
-  name: "android.admin.cts.DevicePolicyManagerTest",
-  bug: 4993068
-},
-{
-  name: "android.media.cts.MediaRecorderTest#testSetCamera",
-  bug: 4464677
-},
 {
   name: "android.telephony.cts.PhoneNumberFormattingTextWatcherTest#testPhoneNumberFormattingTextWatcher",
   bug: 3198578
@@ -21,7 +12,6 @@
   description: "Need investigation.",
   names: [
     "android.provider.cts.Contacts_PeopleTest#testAddToGroup",
-    "android.provider.cts.MediaStore_Audio_Playlists_MembersTest",
     "android.webkit.cts.WebViewTest#testRequestImageRef",
     "tests.api.java.util.CalendarTest#test_getInstance"
   ]
diff --git a/tests/jni/Android.mk b/tests/jni/Android.mk
index 3f38bce..587680d 100644
--- a/tests/jni/Android.mk
+++ b/tests/jni/Android.mk
@@ -21,9 +21,6 @@
 # Don't include this package in any configuration by default.
 LOCAL_MODULE_TAGS := optional
 
-# This isn't part of the system, so don't prelink it.
-LOCAL_PRELINK_MODULE := false
-
 LOCAL_SRC_FILES := \
 		CtsJniOnLoad.cpp \
 		android_os_cts_FileUtils.cpp \
diff --git a/tests/src/android/opengl/cts/GLSurfaceViewStubActivity.java b/tests/src/android/opengl/cts/GLSurfaceViewStubActivity.java
index 5a8f310..79da413 100644
--- a/tests/src/android/opengl/cts/GLSurfaceViewStubActivity.java
+++ b/tests/src/android/opengl/cts/GLSurfaceViewStubActivity.java
@@ -25,6 +25,7 @@
 
 /**
  * A minimal activity for testing {@link android.opengl.GLSurfaceView}.
+ * Also accepts non-blank renderers to allow its use for more complex tests.
  */
 public class GLSurfaceViewStubActivity extends Activity {
 
@@ -45,11 +46,60 @@
 
     private GLSurfaceView mView;
 
+    /** To override the blank renderer, or other settings, these
+     * static set* methods must be called before onCreate() is called.
+     * If using ActivityInstrumentationTestCase2, that means the set
+     * methods need to be called before calling getActivity in the
+     * test setUp().
+     */
+    private static GLSurfaceView.Renderer mRenderer = null;
+    public static void setRenderer(GLSurfaceView.Renderer renderer) {
+        mRenderer = renderer;
+    }
+    public static void resetRenderer() {
+        mRenderer = null;
+    }
+
+    private static int mRenderMode = 0;
+    private static boolean mRenderModeSet = false;
+    public static void setRenderMode(int renderMode) {
+        mRenderModeSet = true;
+        mRenderMode = renderMode;
+    }
+    public static void resetRenderMode() {
+        mRenderModeSet = false;
+        mRenderMode = 0;
+    }
+
+    private static int mGlVersion = 0;
+    private static boolean mGlVersionSet = false;
+    public static void setGlVersion(int glVersion) {
+        mGlVersionSet = true;
+        mGlVersion = glVersion;
+    }
+    public static void resetGlVersion() {
+        mGlVersionSet = false;
+        mGlVersion = 0;
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mView = new GLSurfaceView(this);
-        mView.setRenderer(new Renderer());
+        // Only set this if explicitly asked for
+        if (mGlVersionSet) {
+            mView.setEGLContextClientVersion(mGlVersion);
+        }
+        // Use no-op renderer by default
+        if (mRenderer == null) {
+            mView.setRenderer(new Renderer());
+        } else {
+            mView.setRenderer(mRenderer);
+        }
+        // Only set this if explicitly asked for
+        if (mRenderModeSet) {
+            mView.setRenderMode(mRenderMode);
+        }
         setContentView(mView);
     }
 
diff --git a/tests/src/android/renderscript/cts/fe_bool.rs b/tests/src/android/renderscript/cts/fe_bool.rs
new file mode 100644
index 0000000..727635a
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_bool.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const bool *ain, bool *aout) {
+    aout[0] = !ain[0];
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f32.rs b/tests/src/android/renderscript/cts/fe_f32.rs
new file mode 100644
index 0000000..3c649e2
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f32.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const float *ain, float *aout) {
+    aout[0] = ain[0] + 1.0f;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f32_2.rs b/tests/src/android/renderscript/cts/fe_f32_2.rs
new file mode 100644
index 0000000..571100b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f32_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const float2 *ain, float2 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f32_3.rs b/tests/src/android/renderscript/cts/fe_f32_3.rs
new file mode 100644
index 0000000..1df67a7
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f32_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const float3 *ain, float3 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f32_4.rs b/tests/src/android/renderscript/cts/fe_f32_4.rs
new file mode 100644
index 0000000..50a50ec
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f32_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const float4 *ain, float4 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    aout[0].w = ain[0].w + 1.0f;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f64.rs b/tests/src/android/renderscript/cts/fe_f64.rs
new file mode 100644
index 0000000..b609a08
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f64.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const double *ain, double *aout) {
+    aout[0] = ain[0] + 1.0;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f64_2.rs b/tests/src/android/renderscript/cts/fe_f64_2.rs
new file mode 100644
index 0000000..a97628b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f64_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const double2 *ain, double2 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f64_3.rs b/tests/src/android/renderscript/cts/fe_f64_3.rs
new file mode 100644
index 0000000..b6e97b8
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f64_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const double3 *ain, double3 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_f64_4.rs b/tests/src/android/renderscript/cts/fe_f64_4.rs
new file mode 100644
index 0000000..959c30b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_f64_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const double4 *ain, double4 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    aout[0].w = ain[0].w + 1.0;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i16.rs b/tests/src/android/renderscript/cts/fe_i16.rs
new file mode 100644
index 0000000..e45a0a8
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i16.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const short *ain, ushort *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i16_2.rs b/tests/src/android/renderscript/cts/fe_i16_2.rs
new file mode 100644
index 0000000..8eb8245
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i16_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const short2 *ain, ushort2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i16_3.rs b/tests/src/android/renderscript/cts/fe_i16_3.rs
new file mode 100644
index 0000000..09113a5
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i16_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const short3 *ain, ushort3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i16_4.rs b/tests/src/android/renderscript/cts/fe_i16_4.rs
new file mode 100644
index 0000000..4a5ca2c
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i16_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const short4 *ain, ushort4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i32.rs b/tests/src/android/renderscript/cts/fe_i32.rs
new file mode 100644
index 0000000..402a1f7
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i32.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const int *ain, uint *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i32_2.rs b/tests/src/android/renderscript/cts/fe_i32_2.rs
new file mode 100644
index 0000000..bff5460
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i32_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const int2 *ain, uint2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i32_3.rs b/tests/src/android/renderscript/cts/fe_i32_3.rs
new file mode 100644
index 0000000..ce666c0
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i32_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const int3 *ain, uint3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i32_4.rs b/tests/src/android/renderscript/cts/fe_i32_4.rs
new file mode 100644
index 0000000..ab66082
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i32_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const int4 *ain, uint4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i64.rs b/tests/src/android/renderscript/cts/fe_i64.rs
new file mode 100644
index 0000000..352a48e
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i64.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const long *ain, ulong *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i64_2.rs b/tests/src/android/renderscript/cts/fe_i64_2.rs
new file mode 100644
index 0000000..f39531d
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i64_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const long2 *ain, ulong2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i64_3.rs b/tests/src/android/renderscript/cts/fe_i64_3.rs
new file mode 100644
index 0000000..1229137
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i64_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const long3 *ain, ulong3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i64_4.rs b/tests/src/android/renderscript/cts/fe_i64_4.rs
new file mode 100644
index 0000000..5e2b2ae
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i64_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const long4 *ain, ulong4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i8.rs b/tests/src/android/renderscript/cts/fe_i8.rs
new file mode 100644
index 0000000..067ef50
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i8.rs
@@ -0,0 +1,7 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const char *ain, uchar *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i8_2.rs b/tests/src/android/renderscript/cts/fe_i8_2.rs
new file mode 100644
index 0000000..cec1f57
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i8_2.rs
@@ -0,0 +1,8 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const char2 *ain, uchar2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i8_3.rs b/tests/src/android/renderscript/cts/fe_i8_3.rs
new file mode 100644
index 0000000..9254ba5
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i8_3.rs
@@ -0,0 +1,9 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const char3 *ain, uchar3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_i8_4.rs b/tests/src/android/renderscript/cts/fe_i8_4.rs
new file mode 100644
index 0000000..0c1fd1d
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_i8_4.rs
@@ -0,0 +1,10 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const char4 *ain, uchar4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/fe_struct.rs b/tests/src/android/renderscript/cts/fe_struct.rs
new file mode 100644
index 0000000..b22604d
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fe_struct.rs
@@ -0,0 +1,13 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+struct fe_test {
+    int i;
+    float f;
+};
+
+void root(const struct fe_test *ain, struct fe_test *aout) {
+    aout[0].i = ain[0].i + 1;
+    aout[0].f = ain[0].f + 1.0f;
+    return;
+}
diff --git a/tests/src/android/renderscript/cts/graphics_runner.rs b/tests/src/android/renderscript/cts/graphics_runner.rs
index b8ec15f..18e1f76 100644
--- a/tests/src/android/renderscript/cts/graphics_runner.rs
+++ b/tests/src/android/renderscript/cts/graphics_runner.rs
@@ -39,7 +39,7 @@
 }
 
 // Just draw a quad with previously setup state
-int root(int launchID) {
+int root(void) {
     rsDebug("Running script", 0);
     return 0;
 }
diff --git a/tests/src/android/renderscript/cts/negate.rs b/tests/src/android/renderscript/cts/negate.rs
new file mode 100644
index 0000000..af76faa
--- /dev/null
+++ b/tests/src/android/renderscript/cts/negate.rs
@@ -0,0 +1,22 @@
+// Copyright (C) 2011 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.
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+void root(const int *ain, int *aout) {
+    aout[0] = -1 * ain[0];
+    return;
+}
+
diff --git a/tests/src/android/renderscript/cts/primitives.rs b/tests/src/android/renderscript/cts/primitives.rs
old mode 100644
new mode 100755
index 55710cd..c121ec4
--- a/tests/src/android/renderscript/cts/primitives.rs
+++ b/tests/src/android/renderscript/cts/primitives.rs
@@ -1,3 +1,14 @@
+/*****************************************************************************
+ *****
+ *****
+ *****
+ ***** DANGER
+ ***** DO NOT ALTER THIS TEST WITHOUT VERIFYING ScriptTest.java STILL WORKS
+ ***** WE DEPEND ON VARIABLE ORDER FOR VERIFICATION
+ *****
+ *****
+ *****
+ *****************************************************************************/
 #include "shared.rsh"
 #include "structs.rsh"
 
@@ -9,6 +20,14 @@
 int intTest = -32;
 long longTest = 17179869184l; // 1 << 34
 long long longlongTest = 68719476736l; // 1 << 36
+bool boolTest = false;
+
+struct myStruct {
+    int i;
+} structTest;
+
+rs_allocation allocationTest;
+int *intPtrTest;
 
 uchar ucharTest = 8;
 ushort ushortTest = 16;
diff --git a/tests/src/android/renderscript/cts/structs.rsh b/tests/src/android/renderscript/cts/structs.rsh
index 58f6186..e7d2efd 100755
--- a/tests/src/android/renderscript/cts/structs.rsh
+++ b/tests/src/android/renderscript/cts/structs.rsh
@@ -13,12 +13,12 @@
 // limitations under the License.
 
 typedef struct ConstMatrix {
-    rs_matrix4x4 MVP;
+    rs_matrix4x4 MATRIX;
 } ConstMatrix_s;
 ConstMatrix_s *c1;
 
 typedef struct ConstComplex {
-    rs_matrix4x4 MVP;
+    rs_matrix4x4 MATRIX;
     rs_matrix4x4 EXTRA;
     float extra1;
     float2 extra2;
diff --git a/tests/src/android/speech/tts/cts/StubTextToSpeechService.java b/tests/src/android/speech/tts/cts/StubTextToSpeechService.java
new file mode 100644
index 0000000..5e6bb41
--- /dev/null
+++ b/tests/src/android/speech/tts/cts/StubTextToSpeechService.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+package android.speech.tts.cts;
+
+import android.media.AudioFormat;
+import android.speech.tts.SynthesisCallback;
+import android.speech.tts.SynthesisRequest;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TextToSpeechService;
+
+/**
+ * Stub implementation of {@link TextToSpeechService}. Used for testing the
+ * TTS engine API.
+ */
+public class StubTextToSpeechService extends TextToSpeechService {
+
+    @Override
+    protected String[] onGetLanguage() {
+        return new String[] { "eng", "USA", "" };
+    }
+
+    @Override
+    protected int onIsLanguageAvailable(String lang, String country, String variant) {
+        return TextToSpeech.LANG_AVAILABLE;
+    }
+
+    @Override
+    protected int onLoadLanguage(String lang, String country, String variant) {
+        return TextToSpeech.LANG_AVAILABLE;
+    }
+
+    @Override
+    protected void onStop() {
+    }
+
+    @Override
+    protected void onSynthesizeText(SynthesisRequest request, SynthesisCallback callback) {
+        if (callback.start(16000, AudioFormat.ENCODING_PCM_16BIT, 1) != TextToSpeech.SUCCESS) {
+            return;
+        }
+        byte[] data = { 0x01, 0x2 };
+        if (callback.audioAvailable(data, 0, data.length) != TextToSpeech.SUCCESS) {
+            return;
+        }
+        if (callback.done() != TextToSpeech.SUCCESS) {
+            return;
+        }
+    }
+
+}
diff --git a/tests/src/android/webkit/cts/CtsTestServer.java b/tests/src/android/webkit/cts/CtsTestServer.java
index b6d447b..dba7b62 100644
--- a/tests/src/android/webkit/cts/CtsTestServer.java
+++ b/tests/src/android/webkit/cts/CtsTestServer.java
@@ -15,7 +15,7 @@
  */
 package android.webkit.cts;
 
-import org.apache.harmony.luni.util.Base64;
+import libcore.io.Base64;
 import org.apache.http.Header;
 import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
diff --git a/tests/src/android/webkit/cts/WebDriverStubActivity.java b/tests/src/android/webkit/cts/WebDriverStubActivity.java
new file mode 100644
index 0000000..092156b
--- /dev/null
+++ b/tests/src/android/webkit/cts/WebDriverStubActivity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.webkit.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.webdriver.WebDriver;
+
+/**
+ * A stub activity for WebDriver tests.
+ */
+public class WebDriverStubActivity extends Activity {
+    private WebDriver mDriver;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        WebView view = new WebView(this);
+
+        WebSettings settings = view.getSettings();
+        settings.setJavaScriptCanOpenWindowsAutomatically(true);
+        settings.setSupportMultipleWindows(true);
+        settings.setBuiltInZoomControls(true);
+        settings.setJavaScriptEnabled(true);
+        settings.setAppCacheEnabled(true);
+        settings.setDatabaseEnabled(true);
+        settings.setDomStorageEnabled(true);
+        settings.setGeolocationEnabled(true);
+        settings.setSaveFormData(true);
+
+        mDriver = new WebDriver(view);
+
+        setContentView(view);
+    }
+
+    public WebDriver getDriver() {
+        return mDriver;
+    }
+}
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
index 07812b8..32276a8 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
@@ -84,7 +84,7 @@
      * Timeout required for pending Binder calls or event processing to
      * complete.
      */
-    private static final long MAX_TIMEOUT_ASYNCHRONOUS_PROCESSING = 2000;
+    private static final long MAX_TIMEOUT_ASYNCHRONOUS_PROCESSING = 1000;
 
     /**
      * The count of the polling attempts during {@link #MAX_TIMEOUT_ASYNCHRONOUS_PROCESSING}
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
index 5ff5e67..7b86be6 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
@@ -89,7 +89,7 @@
             case DisplayMetrics.DENSITY_HIGH:
             case DisplayMetrics.DENSITY_XHIGH:
             case DENSITY_TV:
-                expectedMinimumMemory = isXLarge ? 48 : 32;
+                expectedMinimumMemory = isXLarge ? 48 : 48;
                 break;
 
             default:
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java b/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
index 2da0bfb..1cc4cfb 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverSyncTestCase.java
@@ -57,9 +57,6 @@
         // Need to clean up created account
         removeAccount(sAccountManager, ACCOUNT, null /* callback */);
 
-        // Need to cancel any sync that was started.
-        cancelSync(null, AUTHORITY, LATCH_TIMEOUT_MS);
-
         super.tearDown();
     }
 
@@ -90,8 +87,8 @@
     }
 
     private CountDownLatch setNewLatch(CountDownLatch latch) {
-        getMockSyncAdapter().clearData();
         getMockSyncAdapter().setLatch(latch);
+        getMockSyncAdapter().clearData();
         return latch;
     }
 
@@ -104,9 +101,7 @@
 
         // Wait with timeout for the callback to do its work
         try {
-            if (!latch.await(latchTimeoutMs, TimeUnit.MILLISECONDS)) {
-                fail("should not time out waiting on latch");
-            }
+            latch.await(latchTimeoutMs, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
             fail("should not throw an InterruptedException");
         }
diff --git a/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java b/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
index 01620b5..014b08c 100644
--- a/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
@@ -376,29 +376,8 @@
     private void assertWriteToParcel(Configuration config, Parcel parcel) {
         config.writeToParcel(parcel, 0);
         parcel.setDataPosition(0);
-        assertEquals(config.fontScale, parcel.readFloat());
-        assertEquals(config.mcc, parcel.readInt());
-        assertEquals(config.mnc, parcel.readInt());
-        if (config.locale == null) {
-            assertEquals(0, parcel.readInt());
-        } else {
-            assertEquals(1, parcel.readInt());
-            assertEquals(config.locale.getLanguage(),
-                    parcel.readString());
-            assertEquals(config.locale.getCountry(),
-                    parcel.readString());
-            assertEquals(config.locale.getVariant(),
-                    parcel.readString());
-        }
-        parcel.readInt();
-        assertEquals(config.touchscreen, parcel.readInt());
-        assertEquals(config.keyboard, parcel.readInt());
-        assertEquals(config.keyboardHidden, parcel.readInt());
-        assertEquals(config.hardKeyboardHidden, parcel.readInt());
-        assertEquals(config.navigation, parcel.readInt());
-        assertEquals(config.navigationHidden, parcel.readInt());
-        assertEquals(config.orientation, parcel.readInt());
-        assertEquals(config.screenLayout, parcel.readInt());
+        Configuration readConf = new Configuration();
+        readConf.readFromParcel(parcel);
+        assertEquals(config, readConf);
     }
-
 }
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 2af36ff..624f35a 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -22,9 +22,6 @@
 import android.view.Display;
 import android.view.WindowManager;
 
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * Test for verifying a device's screen configuration.
  */
@@ -52,15 +49,5 @@
         boolean format4x3 = Math.ceil(max * 3.0d / 4.0d) >= min;
         assertTrue("Aspect ratio must be between 4:3 and 16:9. It was " + max + ":" + min,
                 format4x3 && format16x9);
-
-        Set<Integer> allowedDensities = new HashSet<Integer>();
-        allowedDensities.add(DisplayMetrics.DENSITY_LOW);
-        allowedDensities.add(DisplayMetrics.DENSITY_MEDIUM);
-        allowedDensities.add(DisplayMetrics.DENSITY_HIGH);
-        allowedDensities.add(DisplayMetrics.DENSITY_XHIGH);
-        assertTrue("DisplayMetrics#densityDpi must be one of the DisplayMetrics.DENSITY_* values: "
-                + allowedDensities, allowedDensities.contains(metrics.densityDpi));
-
-        assertEquals(metrics.density, (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
     }
 }
diff --git a/tests/tests/drm/src/android/drm/cts/DRMTest.java b/tests/tests/drm/src/android/drm/cts/DRMTest.java
index dc87530..631446c 100644
--- a/tests/tests/drm/src/android/drm/cts/DRMTest.java
+++ b/tests/tests/drm/src/android/drm/cts/DRMTest.java
@@ -183,7 +183,9 @@
     }
 
     private void executeProcessDrmInfo(DrmInfo drmInfo, Config config) throws Exception {
-        assertNotNull("Failed on plugin: " + config.getPluginName(), drmInfo);
+        if (drmInfo == null) {
+            return;
+        }
 
         mDrmManagerClient.setOnEventListener(new OnEventListenerImpl(config));
         drmInfo.put(DrmInfoRequest.ACCOUNT_ID, config.getAccountId());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
index d503938..8a5d7aa 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
@@ -18,32 +18,30 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.IOException;
+
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
-import android.graphics.Bitmap.Config;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ClipDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Drawable.Callback;
 import android.graphics.drawable.Drawable.ConstantState;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.StateSet;
 import android.util.Xml;
 import android.view.Gravity;
-
-import java.io.IOException;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(android.graphics.drawable.ClipDrawable.class)
 public class ClipDrawableTest extends AndroidTestCase {
@@ -523,7 +521,7 @@
         }
     }
 
-    private class MockCallback implements Callback {
+    private class MockCallback implements Drawable.Callback2 {
         private Drawable mInvalidateDrawable;
         private Drawable mScheduleDrawable;
         private Runnable mRunnable;
@@ -559,5 +557,9 @@
             mScheduleDrawable = who;
             mRunnable = what;
         }
+
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
index c9107ab..9191cac 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
@@ -16,11 +16,9 @@
 
 package android.graphics.drawable.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
+import junit.framework.TestCase;
+
+import java.util.Arrays;
 
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
@@ -28,13 +26,13 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.DrawableContainer;
-import android.graphics.drawable.LevelListDrawable;
-import android.graphics.drawable.Drawable.Callback;
 import android.graphics.drawable.DrawableContainer.DrawableContainerState;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
+import android.graphics.drawable.LevelListDrawable;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(DrawableContainer.class)
 public class DrawableContainerTest extends TestCase {
@@ -1098,7 +1096,7 @@
         }
     }
 
-    private class MockCallBack implements Callback {
+    private class MockCallBack implements Drawable.Callback2 {
         private boolean mCalledInvalidateDrawable;
 
         private boolean mCalledScheduleDrawable;
@@ -1134,5 +1132,9 @@
         public void unscheduleDrawable(Drawable who, Runnable what) {
             mCalledUnscheduleDrawable = true;
         }
+
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
index 9d586d9..412547b 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
@@ -18,15 +18,17 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
 import android.content.ContentResolver;
 import android.content.res.Resources;
 import android.graphics.Canvas;
@@ -35,20 +37,16 @@
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Drawable.Callback;
 import android.net.Uri;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.StateSet;
 import android.util.Xml;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(Drawable.class)
 public class DrawableTest extends AndroidTestCase {
@@ -696,6 +694,22 @@
         assertSame(mockDrawable, mockDrawable.mutate());
     }
 
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "isLayoutRtlSelf",
+        args = {java.lang.Runnable.class}
+    )
+    public void getResolvedLayoutDirectionSelf() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MockCallback mockCallback = new MockCallback(1);
+        mockDrawable.setCallback(mockCallback);
+        assertEquals(1, mockDrawable.getResolvedLayoutDirectionSelf());
+
+        mockCallback = new MockCallback(0);
+        mockDrawable.setCallback(mockCallback);
+        assertEquals(0, mockDrawable.getResolvedLayoutDirectionSelf());
+    }
+
     private static class MockDrawable extends Drawable {
         private ColorFilter mColorFilter;
 
@@ -730,11 +744,21 @@
         }
     }
 
-    private static class MockCallback implements Callback {
+    private static class MockCallback implements Drawable.Callback2 {
         private Drawable mInvalidateDrawable;
         private Drawable mScheduleDrawable;
         private Runnable mRunnable;
         private long mWhen;
+        private int mLayoutDirection;
+
+        public MockCallback() {
+            // 0 for LTR layout direction
+            this(0);
+        }
+
+        public MockCallback(int direction) {
+            mLayoutDirection = direction;
+        }
 
         public Drawable getInvalidateDrawable() {
             return mInvalidateDrawable;
@@ -766,5 +790,9 @@
             mScheduleDrawable = who;
             mRunnable = what;
         }
+
+        public int getResolvedLayoutDirection(Drawable who) {
+            return mLayoutDirection;
+        }
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index 604f1e2..cb9b7b6 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -18,14 +18,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.IOException;
+
 import android.R.attr;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
@@ -37,19 +33,21 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Drawable.ConstantState;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.RotateDrawable;
 import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.StateListDrawable;
-import android.graphics.drawable.Drawable.Callback;
-import android.graphics.drawable.Drawable.ConstantState;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.StateSet;
 import android.view.View;
-
-import java.io.IOException;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(android.graphics.drawable.LayerDrawable.class)
 public class LayerDrawableTest extends AndroidTestCase {
@@ -418,7 +416,7 @@
         assertFalse(cb.hasCalledUnschedule());
     }
 
-    private static class MockCallback implements Callback {
+    private static class MockCallback implements Drawable.Callback2 {
         private boolean mCalledInvalidate;
         private boolean mCalledSchedule;
         private boolean mCalledUnschedule;
@@ -447,6 +445,10 @@
             return mCalledUnschedule;
         }
 
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
+
         public void reset() {
             mCalledInvalidate = false;
             mCalledSchedule = false;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
index 97bc210..8dde6a3 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
@@ -18,15 +18,11 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.IOException;
+
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Canvas;
@@ -35,14 +31,16 @@
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.RotateDrawable;
-import android.graphics.drawable.Drawable.Callback;
 import android.graphics.drawable.Drawable.ConstantState;
+import android.graphics.drawable.RotateDrawable;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.Xml;
-
-import java.io.IOException;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(android.graphics.drawable.RotateDrawable.class)
 public class RotateDrawableTest extends AndroidTestCase {
@@ -352,7 +350,7 @@
         assertEquals(50, ((BitmapDrawable) d3.getDrawable()).getPaint().getAlpha());
     }
 
-    private static class MockCallback implements Callback {
+    private static class MockCallback implements Drawable.Callback2 {
         private boolean mCalledInvalidate;
         private boolean mCalledSchedule;
         private boolean mCalledUnschedule;
@@ -381,6 +379,10 @@
             return mCalledUnschedule;
         }
 
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
+
         public void reset() {
             mCalledInvalidate = false;
             mCalledSchedule = false;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
index 23e8745..12e8279 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
@@ -18,14 +18,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import org.xmlpull.v1.XmlPullParserException;
 
+import java.io.IOException;
+
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Canvas;
@@ -33,16 +29,18 @@
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.ScaleDrawable;
-import android.graphics.drawable.Drawable.Callback;
 import android.graphics.drawable.Drawable.ConstantState;
+import android.graphics.drawable.ScaleDrawable;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.StateSet;
 import android.view.Gravity;
-
-import java.io.IOException;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(android.graphics.drawable.ScaleDrawable.class)
 public class ScaleDrawableTest extends AndroidTestCase {
@@ -149,7 +147,7 @@
         assertFalse(cb.hasCalledUnschedule());
     }
 
-    private static class MockCallback implements Callback {
+    private static class MockCallback implements Drawable.Callback2 {
         private boolean mCalledInvalidate;
         private boolean mCalledSchedule;
         private boolean mCalledUnschedule;
@@ -178,6 +176,10 @@
             return mCalledUnschedule;
         }
 
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
+
         public void reset() {
             mCalledInvalidate = false;
             mCalledSchedule = false;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
index c02593f..a60bfe9 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
@@ -18,21 +18,19 @@
 
 import com.android.cts.stub.R;
 
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.TransitionDrawable;
+import android.test.InstrumentationTestCase;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
 import dalvik.annotation.ToBeFixed;
 
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Bitmap.Config;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.TransitionDrawable;
-import android.graphics.drawable.Drawable.Callback;
-import android.test.InstrumentationTestCase;
-
 @TestTargetClass(TransitionDrawable.class)
 public class TransitionDrawableTest extends InstrumentationTestCase {
     private static final int COLOR1 = 0xff0000ff;
@@ -314,7 +312,7 @@
         }
     }
 
-    private class MockCallBack implements Callback {
+    private class MockCallBack implements Drawable.Callback2 {
         private boolean mHasCalledInvalidateDrawable;
 
         public boolean hasCalledInvalidateDrawable() {
@@ -333,5 +331,9 @@
 
         public void unscheduleDrawable(Drawable who, Runnable what) {
         }
+
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
     }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
new file mode 100644
index 0000000..545ac48
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
@@ -0,0 +1,864 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.hardware.cts;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.hardware.Camera.Parameters;
+import android.hardware.Camera.Size;
+
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.Matrix;
+import android.opengl.cts.GLSurfaceViewStubActivity;
+
+import android.os.ConditionVariable;
+import android.os.Environment;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.MoreAsserts;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.microedition.khronos.egl.EGL10;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.egl.EGLContext;
+import javax.microedition.khronos.egl.EGLDisplay;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ * This test case must run with hardware. It can't be tested in emulator
+ */
+@LargeTest
+@TestTargetClass(Camera.class)
+public class CameraGLTest extends ActivityInstrumentationTestCase2<GLSurfaceViewStubActivity> {
+    private static final String TAG = "CameraGLTest";
+    private static final String PACKAGE = "com.android.cts.stub";
+    private static final boolean LOGV = false;
+    private static final boolean LOGVV = false;
+    private static final int EGL_OPENGL_ES2_BIT = 0x0004;
+
+    private boolean mSurfaceTextureCallbackResult = false;
+
+    private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 1500;  // Milliseconds.
+    private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 3000;
+    private static final int WAIT_FOR_SNAPSHOT_TO_COMPLETE = 5000;
+
+    private SurfaceTextureCallback mSurfaceTextureCallback = new SurfaceTextureCallback();
+    private SurfaceTextureBurstCallback mSurfaceTextureBurstCallback = new SurfaceTextureBurstCallback();
+    private PreviewCallback mPreviewCallback = new PreviewCallback();
+
+    private Looper mLooper = null;
+    private final ConditionVariable mSurfaceTextureDone = new ConditionVariable();
+    private final ConditionVariable mPreviewDone = new ConditionVariable();
+
+    Camera mCamera;
+    SurfaceTexture mSurfaceTexture;
+    Renderer mRenderer;
+    GLSurfaceView mGLView;
+
+    public CameraGLTest() {
+        super(PACKAGE, GLSurfaceViewStubActivity.class);
+        if (LOGV) Log.v(TAG, "CameraGLTest Constructor");
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Set up renderer instance
+        mRenderer = this.new Renderer();
+        GLSurfaceViewStubActivity.setRenderer(mRenderer);
+        GLSurfaceViewStubActivity.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
+        GLSurfaceViewStubActivity.setGlVersion(2);
+        // Start CameraStubActivity.
+        GLSurfaceViewStubActivity stubActivity = getActivity();
+        // Store a link to the view so we can redraw it when needed
+        mGLView = stubActivity.getView();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mCamera != null) {
+            mCamera.release();
+            mCamera = null;
+        }
+        // Clean up static values in stub so it can be reused
+        GLSurfaceViewStubActivity.resetRenderMode();
+        GLSurfaceViewStubActivity.resetRenderer();
+        GLSurfaceViewStubActivity.resetGlVersion();
+
+        super.tearDown();
+    }
+
+    /**
+     * Initializes the message looper so that the Camera object can
+     * receive the callback messages.
+     */
+    private void initializeMessageLooper(final int cameraId) {
+        final ConditionVariable startDone = new ConditionVariable();
+        new Thread() {
+            @Override
+            public void run() {
+                Log.v(TAG, "Start camera/surfacetexture thread");
+                // Set up a looper to be used by camera.
+                Looper.prepare();
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+                // These must be instantiated outside the UI thread, since the
+                // UI thread will be doing a lot of waiting, stopping callbacks.
+                mCamera = Camera.open(cameraId);
+                mSurfaceTexture = new SurfaceTexture(mRenderer.getTextureID());
+                Log.v(TAG, "Camera " + cameraId + " is opened.");
+                startDone.open();
+                Looper.loop(); // Blocks forever until Looper.quit() is called.
+                Log.v(TAG, "Stop camera/surfacetexture thread");
+            }
+        }.start();
+
+        Log.v(TAG, "start waiting for looper");
+        if (!startDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
+            fail("initializeMessageLooper: start timeout");
+        }
+    }
+
+    /**
+     * Terminates the message looper thread.
+     */
+    private void terminateMessageLooper() throws Exception {
+        mCamera.release();
+        mLooper.quit();
+        // Looper.quit() is asynchronous. The looper may still has some
+        // preview callbacks in the queue after quit is called. The preview
+        // callback still uses the camera object (setHasPreviewCallback).
+        // After camera is released, RuntimeException will be thrown from
+        // the method. So we need to join the looper thread here.
+        mLooper.getThread().join();
+        mCamera = null;
+        mSurfaceTexture = null;
+    }
+
+    /** The camera preview callback. Stops capture after the first callback */
+    private final class PreviewCallback
+            implements android.hardware.Camera.PreviewCallback {
+        public void onPreviewFrame(byte [] data, Camera camera) {
+            if (LOGV) Log.v(TAG, "PreviewCallback");
+            assertNotNull(data);
+            Size size = camera.getParameters().getPreviewSize();
+            assertEquals(size.width * size.height * 3 / 2, data.length);
+            mCamera.stopPreview();
+            mPreviewDone.open();
+        }
+    }
+
+    /** A simple SurfaceTexture listener callback, meant to be used together with the camera preview
+     * callback */
+    private final class SurfaceTextureCallback
+            implements android.graphics.SurfaceTexture.OnFrameAvailableListener {
+        public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+            if (LOGV) Log.v(TAG, "SurfaceTextureCallback");
+            mSurfaceTextureDone.open();
+            // Assumes preview is stopped elsewhere
+        }
+    }
+
+    /** A burst SurfaceTexture listener callback, used for multiple-frame capture */
+    private final class SurfaceTextureBurstCallback
+            implements android.graphics.SurfaceTexture.OnFrameAvailableListener {
+
+        public void setBurstCount(int burstCount) {
+            mBurstCount = burstCount;
+        }
+
+        public int getBurstCount() {
+            return mBurstCount;
+        }
+
+        public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+            if (LOGVV) Log.v(TAG, "SurfaceTextureBurstCallback, frame #" + mBurstCount);
+            mBurstCount--;
+            if (!mSurfaceTextureCallbackResult) {
+                if (mBurstCount <= 0) {
+                    if (LOGV) Log.v(TAG, "SurfaceTextureBurstCallback stopping preview.");
+                    mCamera.stopPreview();
+                    if (LOGVV) Log.v(TAG, "SurfaceTextureBurstCallback preview stopped.");
+                    mSurfaceTextureCallbackResult = true;
+                }
+                mSurfaceTextureDone.open();
+            }
+        }
+
+        private int mBurstCount = 0;
+    }
+
+    /** Waits until surface texture callbacks have fired */
+    private boolean waitForSurfaceTextureDone() {
+        if (LOGVV) Log.v(TAG, "Wait for surface texture callback");
+        if (!mSurfaceTextureDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
+            // timeout could be expected or unexpected. The caller will decide.
+            Log.v(TAG, "waitForSurfaceTextureDone: timeout");
+            return false;
+        }
+        mSurfaceTextureDone.close();
+        return true;
+    }
+
+    /** Waits until the camera preview callback has fired */
+    private boolean waitForPreviewDone() {
+        if (LOGVV) Log.v(TAG, "Wait for preview callback");
+        if (!mPreviewDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
+            // timeout could be expected or unexpected. The caller will decide.
+            Log.v(TAG, "waitForPreviewDone: timeout");
+            return false;
+        }
+        mPreviewDone.close();
+        return true;
+    }
+
+    /** @return OpenGL ES major version 1 or 2 or some negative number for error */
+    private static int getDetectedVersion() {
+        /*
+         * Get all the device configurations and check if any of the attributes specify the
+         * the EGL_OPENGL_ES2_BIT to determine whether the device supports 2.0.
+         */
+        EGL10 egl = (EGL10) EGLContext.getEGL();
+        EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
+        int[] numConfigs = new int[1];
+
+        if (egl.eglInitialize(display, null)) {
+            try {
+                if (egl.eglGetConfigs(display, null, 0, numConfigs)) {
+                    EGLConfig[] configs = new EGLConfig[numConfigs[0]];
+                    if (egl.eglGetConfigs(display, configs, numConfigs[0], numConfigs)) {
+                        int[] value = new int[1];
+                        for (int i = 0; i < numConfigs[0]; i++) {
+                            if (egl.eglGetConfigAttrib(display, configs[i],
+                                    EGL10.EGL_RENDERABLE_TYPE, value)) {
+                                if ((value[0] & EGL_OPENGL_ES2_BIT) == EGL_OPENGL_ES2_BIT) {
+                                    return 2;
+                                }
+                            } else {
+                                Log.w(TAG, "Getting config attribute with "
+                                        + "EGL10#eglGetConfigAttrib failed "
+                                        + "(" + i + "/" + numConfigs[0] + "): "
+                                        + egl.eglGetError());
+                            }
+                        }
+                        return 1;
+                    } else {
+                        Log.e(TAG, "Getting configs with EGL10#eglGetConfigs failed: "
+                                + egl.eglGetError());
+                        return -1;
+                    }
+                } else {
+                    Log.e(TAG, "Getting number of configs with EGL10#eglGetConfigs failed: "
+                            + egl.eglGetError());
+                    return -2;
+                }
+              } finally {
+                  egl.eglTerminate(display);
+              }
+        } else {
+            Log.e(TAG, "Couldn't initialize EGL.");
+            return -3;
+        }
+    }
+
+    /** Generic per-camera test interface */
+    private interface RunPerCamera {
+        void run(int cameraId) throws Exception;
+    }
+
+    /** Generic camera test runner, to minimize boilerplace duplication */
+    private void runForAllCameras(RunPerCamera test) throws Exception {
+        /* Currently OpenGL ES 2.0 is supported for this test, so just skip it
+           if only 1.0 is available. */
+        int glVersion = getDetectedVersion();
+        assertTrue(glVersion > 0);
+        if (glVersion != 2) {
+            Log.w(TAG, "Skipping test because OpenGL ES 2 is not supported");
+            return;
+        }
+
+        /* Make sure the screen stays on while testing - otherwise the OpenGL context may disappear */
+        PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
+        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "CameraGLTest");
+        wl.acquire();
+        try {
+            /* Run the requested test per camera */
+            int nCameras = Camera.getNumberOfCameras();
+            for (int id = 0; id < nCameras; id++) {
+                Log.v(TAG, "Camera id=" + id);
+                test.run(id);
+            }
+        } finally {
+            wl.release();
+        }
+    }
+
+    /** Test Camera.setPreviewTexture in conjunction with the standard Camera preview callback */
+    @UiThreadTest
+    public void testSetPreviewTexturePreviewCallback() throws Exception {
+        runForAllCameras(testSetPreviewTexturePreviewCallbackByCamera);
+    }
+
+    private RunPerCamera testSetPreviewTexturePreviewCallbackByCamera = new RunPerCamera() {
+        public void run(int cameraId) throws Exception {
+            boolean noTimeout;
+            // Check the order: startPreview->setPreviewTexture, with a PreviewCallback as well
+            mPreviewDone.close();
+            initializeMessageLooper(cameraId);
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+            terminateMessageLooper();
+
+            // Check the order: setPreviewTexture->startPreview.
+            initializeMessageLooper(cameraId);
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            mCamera.startPreview();
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+
+            // Check the order: setting preview display to null->startPreview->
+            // setPreviewTexture.
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mCamera.setPreviewTexture(null);
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+            terminateMessageLooper();
+        }
+    };
+
+    /** Test Camera.setPreviewTexture in conjunction with both the standard Camera preview callback,
+        and the SurfaceTexture onFrameAvailable callback */
+    @UiThreadTest
+    public void testSetPreviewTextureBothCallbacks() throws Exception {
+        runForAllCameras(testSetPreviewTextureBothCallbacksByCamera);
+    }
+
+    private RunPerCamera testSetPreviewTextureBothCallbacksByCamera = new RunPerCamera() {
+        public void run(int cameraId) throws Exception {
+            boolean noTimeout;
+            // Check SurfaceTexture callback together with preview callback
+            // Check the order: setPreviewTexture->startPreview
+            mSurfaceTextureDone.close();
+            initializeMessageLooper(cameraId);
+            mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureCallback);
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            mCamera.startPreview();
+
+            noTimeout = waitForSurfaceTextureDone();
+            assertTrue(noTimeout);
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+
+            mGLView.requestRender();
+            terminateMessageLooper();
+
+            // Check the order: startPreview->setPreviewTexture
+            mSurfaceTextureDone.close();
+            initializeMessageLooper(cameraId);
+            mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureCallback);
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+
+            noTimeout = waitForSurfaceTextureDone();
+            assertTrue(noTimeout);
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+
+            mGLView.requestRender();
+
+            // Check the order: setting preview to null->startPreview->setPreviewTexture
+            mCamera.setPreviewCallback(mPreviewCallback);
+            mCamera.setPreviewTexture(null);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureCallback);
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            noTimeout = waitForPreviewDone();
+            assertTrue(noTimeout);
+            terminateMessageLooper();
+        }
+    };
+
+    /** Test Camera.setPreviewTexture in conjunction with just the SurfaceTexture onFrameAvailable callback */
+    @UiThreadTest
+    public void testSetPreviewTextureTextureCallback() throws Exception {
+        runForAllCameras(testSetPreviewTextureTextureCallbackByCamera);
+    }
+
+    private RunPerCamera testSetPreviewTextureTextureCallbackByCamera = new RunPerCamera() {
+        public void run(int cameraId) throws Exception {
+            boolean noTimeout;
+            // Check that SurfaceTexture callbacks work with no standard
+            // preview callback
+            mSurfaceTextureCallbackResult = false;
+            mSurfaceTextureDone.close();
+            initializeMessageLooper(cameraId);
+            mSurfaceTextureBurstCallback.setBurstCount(1);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureBurstCallback);
+            mCamera.setPreviewTexture(mSurfaceTexture);
+            mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+            mCamera.startPreview();
+
+            noTimeout = waitForSurfaceTextureDone();
+            mGLView.requestRender();
+            assertTrue(noTimeout);
+
+            terminateMessageLooper();
+            assertTrue(mSurfaceTextureCallbackResult);
+
+            // Check that SurfaceTexture callbacks also work with
+            // startPreview->setPreviewTexture
+            mSurfaceTextureCallbackResult = false;
+            mSurfaceTextureDone.close();
+            initializeMessageLooper(cameraId);
+            mSurfaceTextureBurstCallback.setBurstCount(1);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureBurstCallback);
+            mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+
+            noTimeout = waitForSurfaceTextureDone();
+            assertTrue(noTimeout);
+
+            terminateMessageLooper();
+            assertTrue(mSurfaceTextureCallbackResult);
+
+            // Check that SurfaceTexture callbacks also work with
+            // null->startPreview->setPreviewTexture
+            mSurfaceTextureCallbackResult = false;
+            mSurfaceTextureDone.close();
+            initializeMessageLooper(cameraId);
+            mSurfaceTextureBurstCallback.setBurstCount(1);
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureBurstCallback);
+            mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+            mCamera.setPreviewTexture(null);
+            mCamera.startPreview();
+            mCamera.setPreviewTexture(mSurfaceTexture);
+
+            noTimeout = waitForSurfaceTextureDone();
+            assertTrue(noTimeout);
+
+            terminateMessageLooper();
+            assertTrue(mSurfaceTextureCallbackResult);
+        }
+    };
+
+    /** Test all preview sizes and framerates along with SurfaceTexture-provided metadata (texture
+     * transforms and timestamps) */
+    @UiThreadTest
+    public void testCameraToSurfaceTextureMetadata() throws Exception {
+        runForAllCameras(testCameraToSurfaceTextureMetadataByCamera);
+    }
+
+    private RunPerCamera testCameraToSurfaceTextureMetadataByCamera = new RunPerCamera() {
+        public void run(int cameraId) throws Exception {
+            int kLoopCount = 100; // Number of frames to test over
+            boolean noTimeout;
+            initializeMessageLooper(cameraId);
+            Parameters parameters = mCamera.getParameters();
+
+            mSurfaceTexture.setOnFrameAvailableListener(mSurfaceTextureBurstCallback);
+            mCamera.setPreviewTexture(mSurfaceTexture);
+
+            for (Size size: parameters.getSupportedPreviewSizes()) {
+                for (int[] fps: parameters.getSupportedPreviewFpsRange()) {
+                    if (LOGV) {
+                        Log.v(TAG, "Testing camera #" + cameraId +
+                              ", preview size:" + size.width + "x" + size.height +
+                              ", frame rate range: [" +
+                              (fps[Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.) + "," +
+                              (fps[Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.) + "]");
+                    }
+                    parameters.setPreviewSize(size.width, size.height);
+                    parameters.setPreviewFpsRange(fps[Parameters.PREVIEW_FPS_MIN_INDEX],
+                                                  fps[Parameters.PREVIEW_FPS_MAX_INDEX]);
+                    mCamera.setParameters(parameters);
+
+                    assertEquals(size, mCamera.getParameters().getPreviewSize());
+
+                    int[] actualFps = new int[2];
+                    mCamera.getParameters().getPreviewFpsRange(actualFps);
+                    assertEquals(fps[Parameters.PREVIEW_FPS_MIN_INDEX],
+                                 actualFps[Parameters.PREVIEW_FPS_MIN_INDEX]);
+                    assertEquals(fps[Parameters.PREVIEW_FPS_MAX_INDEX],
+                                 actualFps[Parameters.PREVIEW_FPS_MAX_INDEX]);
+
+                    mSurfaceTextureBurstCallback.setBurstCount(kLoopCount);
+                    mSurfaceTextureCallbackResult = false;
+                    mSurfaceTextureDone.close();
+
+                    mRenderer.setCameraSizing(mCamera.getParameters().getPreviewSize());
+                    if (LOGV) Log.v(TAG, "Starting preview");
+                    mCamera.startPreview();
+                    if (LOGVV) Log.v(TAG, "Preview started");
+
+                    long[] timestamps = new long[kLoopCount];
+                    for (int i = 0; i < kLoopCount; i++) {
+                        noTimeout = waitForSurfaceTextureDone();
+                        assertTrue("Timeout waiting for frame " + i +
+                                   " (burst callback thinks " +
+                                   (kLoopCount - mSurfaceTextureBurstCallback.getBurstCount()) +
+                                   ")! (Size " + size.width + "x" + size.height + ", fps [" +
+                                   (fps[Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.) + ", " +
+                                   (fps[Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.) + "])",
+                                   noTimeout);
+
+                        if (LOGVV) Log.v(TAG, "Frame #" + i + " completed");
+                        // Draw the frame (and update the SurfaceTexture)
+                        mGLView.requestRender();
+                        // Wait until frame is drawn, so that the SurfaceTexture has new
+                        // metadata
+                        noTimeout = mRenderer.waitForDrawDone();
+                        assertTrue(noTimeout);
+
+                        // Store timestamps for later
+                        timestamps[i] = mSurfaceTexture.getTimestamp();
+                        // Verify that the surfaceTexture transform has at least one non-zero
+                        // entry
+                        float[] transform = new float[16];
+                        mSurfaceTexture.getTransformMatrix(transform);
+                        boolean nonZero = false;
+                        for (int k = 0; k < 16; k++) {
+                            if (transform[k] != 0.f) {
+                                nonZero = true;
+                                break;
+                            }
+                        }
+                        assertTrue(nonZero);
+                    }
+                    assertTrue(mSurfaceTextureCallbackResult);
+
+                    float expectedMaxFrameDurationMs = 1000.f * 1000.f /
+                            fps[Parameters.PREVIEW_FPS_MIN_INDEX];
+                    float expectedMinFrameDurationMs = 1000.f * 1000.f /
+                            fps[Parameters.PREVIEW_FPS_MAX_INDEX];
+
+                    for (int i = 1; i < kLoopCount; i++) {
+                        float frameDurationMs = (timestamps[i] - timestamps[i - 1]) / 1000000.f;
+                        if (LOGVV) {
+                            Log.v(TAG, "Frame " + i + " duration: " + frameDurationMs +
+                                  " ms, expecting [" + expectedMinFrameDurationMs + "," +
+                                  expectedMaxFrameDurationMs + "]");
+                        }
+                        assertTrue("Frame " + i + " duration out of bounds! ("+
+                                   frameDurationMs + " ms, expecting [" +
+                                   expectedMinFrameDurationMs + "," +
+                                   expectedMaxFrameDurationMs + "] ms)",
+                                   (frameDurationMs > expectedMinFrameDurationMs) &&
+                                   (frameDurationMs < expectedMaxFrameDurationMs) );
+                    }
+                }
+            }
+            terminateMessageLooper();
+        } // void run(int cameraId)
+    };
+
+    /** Basic OpenGL ES 2.0 renderer to draw SurfaceTexture-sourced frames to the screen */
+    private class Renderer implements GLSurfaceView.Renderer {
+        public Renderer() {
+            mTriangleVertices =
+                    ByteBuffer.allocateDirect(mTriangleVerticesData.length * FLOAT_SIZE_BYTES).
+                    order(ByteOrder.nativeOrder()).asFloatBuffer();
+            mTriangleVertices.put(mTriangleVerticesData).position(0);
+
+            Matrix.setIdentityM(mSTMatrix, 0);
+            Matrix.setIdentityM(mMMatrix, 0);
+
+            mTextureID = 0;
+        }
+
+        public void setCameraSizing(Camera.Size previewSize) {
+            mCameraRatio = (float)previewSize.width/previewSize.height;
+        }
+
+        public boolean waitForDrawDone() {
+            if (!mDrawDone.block(WAIT_FOR_COMMAND_TO_COMPLETE) ) {
+                // timeout could be expected or unexpected. The caller will decide.
+                Log.e(TAG, "waitForDrawDone: timeout");
+                return false;
+            }
+            mDrawDone.close();
+            return true;
+        }
+
+        private final ConditionVariable mDrawDone = new ConditionVariable();
+
+        public void onDrawFrame(GL10 glUnused) {
+            if (LOGVV) Log.v(TAG, "onDrawFrame()");
+            if (CameraGLTest.this.mSurfaceTexture != null) {
+                CameraGLTest.this.mSurfaceTexture.updateTexImage();
+                CameraGLTest.this.mSurfaceTexture.getTransformMatrix(mSTMatrix);
+                mDrawDone.open();
+            }
+
+            // Ignore the passed-in GL10 interface, and use the GLES20
+            // class's static methods instead.
+            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+            GLES20.glUseProgram(mProgram);
+            checkGlError("glUseProgram");
+
+            GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
+
+            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+            GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+                                         TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+            checkGlError("glVertexAttribPointer maPosition");
+            GLES20.glEnableVertexAttribArray(maPositionHandle);
+            checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+            mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+            GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
+                                         TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+            checkGlError("glVertexAttribPointer maTextureHandle");
+            GLES20.glEnableVertexAttribArray(maTextureHandle);
+            checkGlError("glEnableVertexAttribArray maTextureHandle");
+
+            Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
+            Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
+
+            GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+            GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
+            GLES20.glUniform1f(muCRatioHandle, mCameraRatio);
+
+            GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+            checkGlError("glDrawArrays");
+        }
+
+        public void onSurfaceChanged(GL10 glUnused, int width, int height) {
+            if (LOGV) Log.v(TAG, "onSurfaceChanged()");
+            // Ignore the passed-in GL10 interface, and use the GLES20
+            // class's static methods instead.
+            GLES20.glViewport(0, 0, width, height);
+            mRatio = (float) width / height;
+            Matrix.frustumM(mProjMatrix, 0, -mRatio, mRatio, -1, 1, 3, 7);
+        }
+
+        public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
+            if (LOGV) Log.v(TAG, "onSurfaceCreated()");
+            // Ignore the passed-in GL10 interface, and use the GLES20
+            // class's static methods instead.
+
+            /* Set up shaders and handles to their variables */
+            mProgram = createProgram(mVertexShader, mFragmentShader);
+            if (mProgram == 0) {
+                return;
+            }
+            maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
+            checkGlError("glGetAttribLocation aPosition");
+            if (maPositionHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aPosition");
+            }
+            maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
+            checkGlError("glGetAttribLocation aTextureCoord");
+            if (maTextureHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aTextureCoord");
+            }
+
+            muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+            checkGlError("glGetUniformLocation uMVPMatrix");
+            if (muMVPMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uMVPMatrix");
+            }
+
+            muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix");
+            checkGlError("glGetUniformLocation uSTMatrix");
+            if (muMVPMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uSTMatrix");
+            }
+
+            muCRatioHandle = GLES20.glGetUniformLocation(mProgram, "uCRatio");
+            checkGlError("glGetUniformLocation uCRatio");
+            if (muMVPMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uCRatio");
+            }
+
+            /*
+             * Create our texture. This has to be done each time the
+             * surface is created.
+             */
+
+            int[] textures = new int[1];
+            GLES20.glGenTextures(1, textures, 0);
+
+            mTextureID = textures[0];
+            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
+            checkGlError("glBindTexture mTextureID");
+
+            // Can't do mipmapping with camera source
+            GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
+                                   GLES20.GL_NEAREST);
+            GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
+                                   GLES20.GL_LINEAR);
+            // Clamp to edge is the only option
+            GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
+                                   GLES20.GL_CLAMP_TO_EDGE);
+            GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
+                                   GLES20.GL_CLAMP_TO_EDGE);
+            checkGlError("glTexParameteri mTextureID");
+
+            Matrix.setLookAtM(mVMatrix, 0, 0, 0, 4f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+        }
+
+        public int getTextureID() {
+            return mTextureID;
+        }
+
+        private int loadShader(int shaderType, String source) {
+            int shader = GLES20.glCreateShader(shaderType);
+            if (shader != 0) {
+                GLES20.glShaderSource(shader, source);
+                GLES20.glCompileShader(shader);
+                int[] compiled = new int[1];
+                GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+                if (compiled[0] == 0) {
+                    Log.e(TAG, "Could not compile shader " + shaderType + ":");
+                    Log.e(TAG, GLES20.glGetShaderInfoLog(shader));
+                    GLES20.glDeleteShader(shader);
+                    shader = 0;
+                }
+            }
+            return shader;
+        }
+
+        private int createProgram(String vertexSource, String fragmentSource) {
+            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+            if (vertexShader == 0) {
+                return 0;
+            }
+            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+            if (pixelShader == 0) {
+                return 0;
+            }
+
+            int program = GLES20.glCreateProgram();
+            if (program != 0) {
+                GLES20.glAttachShader(program, vertexShader);
+                checkGlError("glAttachShader");
+                GLES20.glAttachShader(program, pixelShader);
+                checkGlError("glAttachShader");
+                GLES20.glLinkProgram(program);
+                int[] linkStatus = new int[1];
+                GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+                if (linkStatus[0] != GLES20.GL_TRUE) {
+                    Log.e(TAG, "Could not link program: ");
+                    Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+                    GLES20.glDeleteProgram(program);
+                    program = 0;
+                }
+            }
+            return program;
+        }
+
+        private void checkGlError(String op) {
+            int error;
+            while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+                Log.e(TAG, op + ": glError " + error);
+                throw new RuntimeException(op + ": glError " + error);
+            }
+        }
+
+        private static final int FLOAT_SIZE_BYTES = 4;
+        private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+        private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+        private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+        private final float[] mTriangleVerticesData = {
+            // X, Y, Z, U, V
+            -1.0f, -1.0f, 0, 0.f, 0.f,
+            1.0f, -1.0f, 0, 1.f, 0.f,
+            -1.0f,  1.0f, 0, 0.f, 1.f,
+            1.0f,   1.0f, 0, 1.f, 1.f,
+        };
+
+        private FloatBuffer mTriangleVertices;
+
+        private final String mVertexShader =
+                "uniform mat4 uMVPMatrix;\n" +
+                "uniform mat4 uSTMatrix;\n" +
+                "uniform float uCRatio;\n" +
+                "attribute vec4 aPosition;\n" +
+                "attribute vec4 aTextureCoord;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "void main() {\n" +
+                "  gl_Position = vec4(uCRatio,1,1,1) * uMVPMatrix * aPosition;\n" +
+                "  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
+                "}\n";
+
+        private final String mFragmentShader =
+                "#extension GL_OES_EGL_image_external : require\n" +
+                "precision mediump float;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "uniform samplerExternalOES sTexture;\n" +
+                "void main() {\n" +
+                "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+                "}\n";
+
+        private float[] mMVPMatrix = new float[16];
+        private float[] mProjMatrix = new float[16];
+        private float[] mMMatrix = new float[16];
+        private float[] mVMatrix = new float[16];
+        private float[] mSTMatrix = new float[16];
+
+        private int mProgram;
+        private int mTextureID;
+        private int muMVPMatrixHandle;
+        private int muSTMatrixHandle;
+        private int muCRatioHandle;
+        private int maPositionHandle;
+        private int maTextureHandle;
+
+        private float mRatio = 1.0f;
+        private float mCameraRatio = 1.0f;
+
+        private Context mContext;
+        private static final String TAG = "CameraGLTest.Renderer";
+
+        // Magic key
+        private static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;
+    }
+
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index a336328..22f47c3 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -24,7 +24,9 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.hardware.Camera;
+import android.hardware.Camera.Area;
 import android.hardware.Camera.CameraInfo;
 import android.hardware.Camera.ErrorCallback;
 import android.hardware.Camera.Parameters;
@@ -65,17 +67,26 @@
             "/test.jpg";
     private byte[] mJpegData;
 
-    private boolean mPreviewCallbackResult = false;
+    private static final int PREVIEW_CALLBACK_NOT_RECEIVED = 0;
+    private static final int PREVIEW_CALLBACK_RECEIVED = 1;
+    private static final int PREVIEW_CALLBACK_DATA_NULL = 2;
+    private static final int PREVIEW_CALLBACK_INVALID_FRAME_SIZE = 3;
+    private int mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
+
     private boolean mShutterCallbackResult = false;
     private boolean mRawPictureCallbackResult = false;
     private boolean mJpegPictureCallbackResult = false;
-    private boolean mErrorCallbackResult = false;
+    private static final int NO_ERROR = -1;
+    private int mCameraErrorCode = NO_ERROR;
     private boolean mAutoFocusSucceeded = false;
 
     private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 1500;  // Milliseconds.
     private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 3000;
     private static final int WAIT_FOR_SNAPSHOT_TO_COMPLETE = 5000;
 
+    private static final int FOCUS_AREA = 0;
+    private static final int METERING_AREA = 1;
+
     private PreviewCallback mPreviewCallback = new PreviewCallback();
     private TestShutterCallback mShutterCallback = new TestShutterCallback();
     private RawPictureCallback mRawPictureCallback = new RawPictureCallback();
@@ -115,7 +126,7 @@
      * Initializes the message looper so that the Camera object can
      * receive the callback messages.
      */
-    private void initializeMessageLooper(final int cameraId) {
+    private void initializeMessageLooper(final int cameraId) throws IOException {
         final ConditionVariable startDone = new ConditionVariable();
         new Thread() {
             @Override
@@ -126,7 +137,12 @@
                 // Save the looper so that we can terminate this thread
                 // after we are done with it.
                 mLooper = Looper.myLooper();
-                mCamera = Camera.open(cameraId);
+                try {
+                    mCamera = Camera.open(cameraId);
+                    mCamera.setErrorCallback(mErrorCallback);
+                } catch (RuntimeException e) {
+                    Log.e(TAG, "Fail to open camera." + e);
+                }
                 Log.v(TAG, "camera is opened");
                 startDone.open();
                 Looper.loop(); // Blocks forever until Looper.quit() is called.
@@ -139,6 +155,8 @@
             Log.v(TAG, "initializeMessageLooper: start timeout");
             fail("initializeMessageLooper: start timeout");
         }
+        assertNotNull("Fail to open camera.", mCamera);
+        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
     }
 
     /*
@@ -154,18 +172,29 @@
         mLooper.getThread().join();
         mCamera.release();
         mCamera = null;
+        assertEquals("Got camera error callback.", NO_ERROR, mCameraErrorCode);
     }
 
     //Implement the previewCallback
     private final class PreviewCallback
             implements android.hardware.Camera.PreviewCallback {
         public void onPreviewFrame(byte [] data, Camera camera) {
-            assertNotNull(data);
+            if (data == null) {
+                mPreviewCallbackResult = PREVIEW_CALLBACK_DATA_NULL;
+                mPreviewDone.open();
+                return;
+            }
             Size size = camera.getParameters().getPreviewSize();
             int format = camera.getParameters().getPreviewFormat();
             int bitsPerPixel = ImageFormat.getBitsPerPixel(format);
-            assertEquals(size.width * size.height * bitsPerPixel / 8, data.length);
-            mPreviewCallbackResult = true;
+            if (size.width * size.height * bitsPerPixel / 8 != data.length) {
+                Log.e(TAG, "Invalid frame size " + data.length + ". width=" + size.width
+                        + ". height=" + size.height + ". bitsPerPixel=" + bitsPerPixel);
+                mPreviewCallbackResult = PREVIEW_CALLBACK_INVALID_FRAME_SIZE;
+                mPreviewDone.open();
+                return;
+            }
+            mPreviewCallbackResult = PREVIEW_CALLBACK_RECEIVED;
             mCamera.stopPreview();
             if (LOGV) Log.v(TAG, "notify the preview callback");
             mPreviewDone.open();
@@ -184,11 +213,7 @@
     //Implement the RawPictureCallback
     private final class RawPictureCallback implements PictureCallback {
         public void onPictureTaken(byte [] rawData, Camera camera) {
-            if (rawData != null) {
-                mRawPictureCallbackResult = true;
-            } else {
-                mRawPictureCallbackResult = false;
-            }
+            mRawPictureCallbackResult = true;
             if (LOGV) Log.v(TAG, "RawPictureCallback callback");
         }
     }
@@ -224,8 +249,8 @@
     // Implement the ErrorCallback
     private final class TestErrorCallback implements ErrorCallback {
         public void onError(int error, Camera camera) {
-            mErrorCallbackResult = true;
-            fail("Got camera error from ErrorCallback: " + error);
+            Log.e(TAG, "Got camera error=" + error);
+            mCameraErrorCode = error;
         }
     }
 
@@ -266,7 +291,6 @@
     }
 
     private void checkPreviewCallback() throws Exception {
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         if (LOGV) Log.v(TAG, "check preview callback");
         mCamera.startPreview();
         waitForPreviewDone();
@@ -323,7 +347,6 @@
     private void testTakePictureByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
         Size pictureSize = mCamera.getParameters().getPictureSize();
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
         mCamera.autoFocus(mAutoFocusCallback);
         assertTrue(waitForFocusDone());
@@ -331,8 +354,9 @@
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
         terminateMessageLooper();
-        assertTrue(mShutterCallbackResult);
-        assertTrue(mJpegPictureCallbackResult);
+        assertTrue("Shutter callback not received", mShutterCallbackResult);
+        assertTrue("Raw picture callback not received", mRawPictureCallbackResult);
+        assertTrue("Jpeg picture callback not recieved", mJpegPictureCallbackResult);
         assertNotNull(mJpegData);
         BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
         bmpOptions.inJustDecodeBounds = true;
@@ -390,28 +414,27 @@
     private void testPreviewCallbackByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
         mCamera.setPreviewCallback(mPreviewCallback);
-        mCamera.setErrorCallback(mErrorCallback);
         checkPreviewCallback();
         terminateMessageLooper();
-        assertTrue(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
 
-        mPreviewCallbackResult = false;
+        mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
         initializeMessageLooper(cameraId);
         checkPreviewCallback();
         terminateMessageLooper();
-        assertFalse(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_NOT_RECEIVED, mPreviewCallbackResult);
 
         // Test all preview sizes.
         initializeMessageLooper(cameraId);
         Parameters parameters = mCamera.getParameters();
         for (Size size: parameters.getSupportedPreviewSizes()) {
-            mPreviewCallbackResult = false;
+            mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
             mCamera.setPreviewCallback(mPreviewCallback);
             parameters.setPreviewSize(size.width, size.height);
             mCamera.setParameters(parameters);
             assertEquals(size, mCamera.getParameters().getPreviewSize());
             checkPreviewCallback();
-            assertTrue(mPreviewCallbackResult);
+            assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
             try {
                 // Wait for a while to throw away the remaining preview frames.
                 Thread.sleep(1000);
@@ -442,13 +465,13 @@
         mCamera.setOneShotPreviewCallback(mPreviewCallback);
         checkPreviewCallback();
         terminateMessageLooper();
-        assertTrue(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
 
-        mPreviewCallbackResult = false;
+        mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
         initializeMessageLooper(cameraId);
         checkPreviewCallback();
         terminateMessageLooper();
-        assertFalse(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_NOT_RECEIVED, mPreviewCallbackResult);
     }
 
     @TestTargetNew(
@@ -475,28 +498,28 @@
         mCamera.setPreviewDisplay(holder);
         waitForPreviewDone();
         terminateMessageLooper();
-        assertTrue(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
 
         // Check the order: setPreviewDisplay->startPreview.
         initializeMessageLooper(cameraId);
-        mPreviewCallbackResult = false;
+        mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
         mCamera.setOneShotPreviewCallback(mPreviewCallback);
         mCamera.setPreviewDisplay(holder);
         mCamera.startPreview();
         waitForPreviewDone();
         mCamera.stopPreview();
-        assertTrue(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
 
         // Check the order: setting preview display to null->startPreview->
         // setPreviewDisplay.
-        mPreviewCallbackResult = false;
+        mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
         mCamera.setOneShotPreviewCallback(mPreviewCallback);
         mCamera.setPreviewDisplay(null);
         mCamera.startPreview();
         mCamera.setPreviewDisplay(holder);
         waitForPreviewDone();
         terminateMessageLooper();
-        assertTrue(mPreviewCallbackResult);
+        assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
     }
 
     @TestTargetNew(
@@ -531,7 +554,6 @@
         }
 
         // Start preview.
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
 
         // Check setting orientation during preview is not allowed.
@@ -802,7 +824,6 @@
         assertTrue(sizes.contains(mCamera.new Size(0, 0)));
 
         // Test if the thumbnail size matches the setting.
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
@@ -844,7 +865,6 @@
     private void testJpegExifByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
         Camera.Parameters parameters = mCamera.getParameters();
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
         double focalLength = (double)parameters.getFocalLength();
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
@@ -1000,7 +1020,40 @@
             recorder.setPreviewDisplay(holder.getSurface());
             recorder.prepare();
             recorder.start();
-            Thread.sleep(5000);
+
+            // Apps can use the camera after start since API level 13.
+            Parameters parameters = mCamera.getParameters();
+            if (parameters.isZoomSupported()) {
+               if (parameters.getMaxZoom() > 0) {
+                   parameters.setZoom(1);
+                   mCamera.setParameters(parameters);
+                   parameters.setZoom(0);
+                   mCamera.setParameters(parameters);
+               }
+            }
+            if (parameters.isSmoothZoomSupported()) {
+                if (parameters.getMaxZoom() > 0) {
+                    ZoomListener zoomListener = new ZoomListener();
+                    mCamera.setZoomChangeListener(zoomListener);
+                    mCamera.startSmoothZoom(1);
+                    assertTrue(zoomListener.mZoomDone.block(1000));
+                }
+            }
+
+            try {
+                mCamera.takePicture(null, null, null);
+                fail("takePicture should not succeed during recording.");
+            } catch(RuntimeException e) {
+                // expected
+            }
+            try {
+                mCamera.unlock();
+                fail("unlock should not succeed during recording.");
+            } catch(RuntimeException e) {
+                // expected
+            }
+
+            Thread.sleep(2000);
             recorder.stop();
         } finally {
             recorder.release();
@@ -1055,6 +1108,8 @@
             mCamera.setPreviewCallbackWithBuffer(callback);
             mCamera.startPreview();
             waitForPreviewDone();
+            assertFalse(callback.mPreviewDataNull);
+            assertFalse(callback.mInvalidData);
             assertEquals(1, callback.mNumCbWithBuffer1);
             assertEquals(1, callback.mNumCbWithBuffer2);
             assertEquals(0, callback.mNumCbWithBuffer3);
@@ -1062,6 +1117,8 @@
             // Test if preview callback with buffer still works during preview.
             mCamera.addCallbackBuffer(callback.mBuffer3);
             waitForPreviewDone();
+            assertFalse(callback.mPreviewDataNull);
+            assertFalse(callback.mInvalidData);
             assertEquals(1, callback.mNumCbWithBuffer1);
             assertEquals(1, callback.mNumCbWithBuffer2);
             assertEquals(1, callback.mNumCbWithBuffer3);
@@ -1075,8 +1132,14 @@
             implements android.hardware.Camera.PreviewCallback {
         public int mNumCbWithBuffer1, mNumCbWithBuffer2, mNumCbWithBuffer3;
         public byte[] mBuffer1, mBuffer2, mBuffer3;
+        public boolean mPreviewDataNull, mInvalidData;
         public void onPreviewFrame(byte[] data, Camera camera) {
-            assertNotNull(data);
+            if (data == null) {
+                Log.e(TAG, "Preview data is null!");
+                mPreviewDataNull = true;
+                mPreviewDone.open();
+                return;
+            }
             if (data == mBuffer1) {
                 mNumCbWithBuffer1++;
             } else if (data == mBuffer2) {
@@ -1084,7 +1147,10 @@
             } else if (data == mBuffer3) {
                 mNumCbWithBuffer3++;
             } else {
-                fail("Invalid byte array.");
+                Log.e(TAG, "Invalid byte array.");
+                mInvalidData = true;
+                mPreviewDone.open();
+                return;
             }
 
             if ((mNumCbWithBuffer1 == 1 && mNumCbWithBuffer2 == 1)
@@ -1094,41 +1160,21 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSmoothZoom",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopSmoothZoom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setZoomChangeListener",
-            args = {android.hardware.Camera.OnZoomChangeListener.class}
-        )
-    })
     @UiThreadTest
-    public void testZoom() throws Exception {
+    public void testImmediateZoom() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
             Log.v(TAG, "Camera id=" + id);
-            initializeMessageLooper(id);
-            testImmediateZoom();
-            testSmoothZoom();
-            terminateMessageLooper();
+            testImmediateZoomByCamera(id);
         }
     }
 
-    private void testImmediateZoom() throws Exception {
+    private void testImmediateZoomByCamera(int id) throws Exception {
+        initializeMessageLooper(id);
+
         Parameters parameters = mCamera.getParameters();
         if (!parameters.isZoomSupported()) return;
 
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
-
         // Test the zoom parameters.
         assertEquals(0, parameters.getZoom());  // default zoom should be 0.
         for (Size size: parameters.getSupportedPreviewSizes()) {
@@ -1170,15 +1216,44 @@
                                 mJpegPictureCallback);
             waitForSnapshotDone();
         }
+
+        terminateMessageLooper();
     }
 
-    private void testSmoothZoom() throws Exception {
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "startSmoothZoom",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "stopSmoothZoom",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setZoomChangeListener",
+            args = {android.hardware.Camera.OnZoomChangeListener.class}
+        )
+    })
+    @UiThreadTest
+    public void testSmoothZoom() throws Exception {
+        int nCameras = Camera.getNumberOfCameras();
+        for (int id = 0; id < nCameras; id++) {
+            Log.v(TAG, "Camera id=" + id);
+            testSmoothZoomByCamera(id);
+        }
+    }
+
+    private void testSmoothZoomByCamera(int id) throws Exception {
+        initializeMessageLooper(id);
+
         Parameters parameters = mCamera.getParameters();
         if (!parameters.isSmoothZoomSupported()) return;
         assertTrue(parameters.isZoomSupported());
 
         ZoomListener zoomListener = new ZoomListener();
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.setZoomChangeListener(zoomListener);
         mCamera.startPreview();
         waitForPreviewDone();
@@ -1207,24 +1282,31 @@
         assertEquals(maxZoom, mCamera.getParameters().getZoom());
         assertEquals(maxZoom, zoomListener.mValues.size());
         for(int i = 0; i < maxZoom; i++) {
-            // Make sure we get all the callbacks in order.
-            assertEquals(i + 1, zoomListener.mValues.get(i).intValue());
+            int value = zoomListener.mValues.get(i);
+            boolean stopped = zoomListener.mStopped.get(i);
+            // Make sure we get all the zoom values in order.
+            assertEquals(i + 1, value);
+            // All "stopped" except the last should be false.
+            assertEquals(i == maxZoom - 1, stopped);
         }
 
         // Test startSmoothZoom. Make sure we get all the callbacks.
         if (maxZoom > 1) {
-            zoomListener.mValues = new ArrayList<Integer>();
-            zoomListener.mStopped = false;
+            zoomListener.mValues.clear();
+            zoomListener.mStopped.clear();
             Log.e(TAG, "zoomListener.mStopped = " + zoomListener.mStopped);
             zoomListener.mZoomDone.close();
             mCamera.startSmoothZoom(maxZoom / 2);
             assertTrue(zoomListener.mZoomDone.block(5000));
             assertEquals(maxZoom / 2, mCamera.getParameters().getZoom());
             assertEquals(maxZoom - (maxZoom / 2), zoomListener.mValues.size());
-            int i = maxZoom - 1;
-            for(Integer value: zoomListener.mValues) {
-                assertEquals(i, value.intValue());
-                i--;
+            for(int i = 0; i < zoomListener.mValues.size(); i++) {
+                int value = zoomListener.mValues.get(i);
+                boolean stopped = zoomListener.mStopped.get(i);
+                // Make sure we get all the zoom values in order.
+                assertEquals(maxZoom - 1 - i, value);
+                // All "stopped" except the last should be false.
+                assertEquals(i == zoomListener.mValues.size() - 1, stopped);
             }
         }
 
@@ -1237,8 +1319,8 @@
         }
 
         // Test stopSmoothZoom.
-        zoomListener.mValues = new ArrayList<Integer>();
-        zoomListener.mStopped = false;
+        zoomListener.mValues.clear();
+        zoomListener.mStopped.clear();
         zoomListener.mZoomDone.close();
         parameters.setZoom(0);
         mCamera.setParameters(parameters);
@@ -1248,21 +1330,29 @@
         assertTrue(zoomListener.mZoomDone.block(5000));
         assertEquals(zoomListener.mValues.size(), mCamera.getParameters().getZoom());
         for(int i = 0; i < zoomListener.mValues.size() - 1; i++) {
+            int value = zoomListener.mValues.get(i);
+            boolean stopped = zoomListener.mStopped.get(i);
             // Make sure we get all the callbacks in order (except the last).
-            assertEquals(i + 1, zoomListener.mValues.get(i).intValue());
+            assertEquals(i + 1, value);
+            // All "stopped" except the last should be false. stopSmoothZoom has been called. So the
+            // last "stopped" can be true or false.
+            if (i != zoomListener.mValues.size() - 1) {
+                assertFalse(stopped);
+            }
         }
+
+        terminateMessageLooper();
     }
 
     private final class ZoomListener
             implements android.hardware.Camera.OnZoomChangeListener {
         public ArrayList<Integer> mValues = new ArrayList<Integer>();
-        public boolean mStopped;
+        public ArrayList<Boolean> mStopped = new ArrayList<Boolean>();
         public final ConditionVariable mZoomDone = new ConditionVariable();
 
         public void onZoomChange(int value, boolean stopped, Camera camera) {
             mValues.add(value);
-            assertFalse(mStopped);
-            mStopped = stopped;
+            mStopped.add(stopped);
             if (stopped) {
                 mZoomDone.open();
             }
@@ -1280,7 +1370,6 @@
 
     private void testFocusDistancesByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
         waitForPreviewDone();
         Parameters parameters = mCamera.getParameters();
@@ -1365,7 +1454,6 @@
 
     private void testCancelAutofocusByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         mCamera.startPreview();
 
         // No op if autofocus is not in progress.
@@ -1508,18 +1596,29 @@
 
     private void testPreviewPictureSizesCombinationByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
         Parameters parameters = mCamera.getParameters();
         PreviewCbForPreviewPictureSizesCombination callback =
             new PreviewCbForPreviewPictureSizesCombination();
 
-        // Test all combination of preview sizes and picture sizes.
-        for (Size previewSize: parameters.getSupportedPreviewSizes()) {
-            for (Size pictureSize: parameters.getSupportedPictureSizes()) {
+        // Test combination of preview sizes and picture sizes. Pick four of each to test.
+        // Do not test all combinations because it will timeout. Four is just a small number
+        // and the test will not timeout.
+        List<Size> previewSizes = parameters.getSupportedPreviewSizes();
+        List<Size> pictureSizes = parameters.getSupportedPictureSizes();
+        int previewSizeTestCount = Math.min(previewSizes.size(), 4);
+        int pictureSizeTestCount = Math.min(pictureSizes.size(), 4);
+        // Calculate the step so that the first one and the last one are always tested.
+        float previewSizeIndexStep = (float) (previewSizes.size() - 1) / (previewSizeTestCount - 1);
+        float pictureSizeIndexStep = (float) (pictureSizes.size() - 1) / (pictureSizeTestCount - 1);
+        for (int i = 0; i < previewSizeTestCount; i++) {
+            for (int j = 0; j < pictureSizeTestCount; j++) {
+                Size previewSize = previewSizes.get(Math.round(previewSizeIndexStep * i));
+                Size pictureSize = pictureSizes.get(Math.round(pictureSizeIndexStep * j));
                 Log.v(TAG, "Test previewSize=(" + previewSize.width + "," +
                         previewSize.height + ") pictureSize=(" +
                         pictureSize.width + "," + pictureSize.height + ")");
-                mPreviewCallbackResult = false;
+                mPreviewCallbackResult = PREVIEW_CALLBACK_NOT_RECEIVED;
+                mCamera.setPreviewCallback(callback);
                 callback.expectedPreviewSize = previewSize;
                 parameters.setPreviewSize(previewSize.width, previewSize.height);
                 parameters.setPictureSize(pictureSize.width, pictureSize.height);
@@ -1529,9 +1628,8 @@
 
                 // Check if the preview size is the same as requested.
                 mCamera.startPreview();
-                mCamera.setOneShotPreviewCallback(callback);
                 waitForPreviewDone();
-                assertTrue(mPreviewCallbackResult);
+                assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
 
                 // Check if the picture size is the same as requested.
                 mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
@@ -1552,18 +1650,31 @@
             implements android.hardware.Camera.PreviewCallback {
         public Size expectedPreviewSize;
         public void onPreviewFrame(byte[] data, Camera camera) {
-            assertNotNull(data);
+            if (data == null) {
+                mPreviewCallbackResult = PREVIEW_CALLBACK_DATA_NULL;
+                mPreviewDone.open();
+                return;
+            }
             Size size = camera.getParameters().getPreviewSize();
-            assertEquals(expectedPreviewSize, size);
             int format = camera.getParameters().getPreviewFormat();
             int bitsPerPixel = ImageFormat.getBitsPerPixel(format);
-            assertEquals(size.width * size.height * bitsPerPixel / 8, data.length);
+            if (!expectedPreviewSize.equals(size) ||
+                    size.width * size.height * bitsPerPixel / 8 != data.length) {
+                Log.e(TAG, "Expected preview width=" + expectedPreviewSize.width + ", height="
+                        + expectedPreviewSize.height + ". Actual width=" + size.width + ", height="
+                        + size.height);
+                Log.e(TAG, "Frame data length=" + data.length + ". bitsPerPixel=" + bitsPerPixel);
+                mPreviewCallbackResult = PREVIEW_CALLBACK_INVALID_FRAME_SIZE;
+                mPreviewDone.open();
+                return;
+            }
             camera.setPreviewCallback(null);
-            mPreviewCallbackResult = true;
+            mPreviewCallbackResult = PREVIEW_CALLBACK_RECEIVED;
             mPreviewDone.open();
         }
     }
 
+    @UiThreadTest
     public void testPreviewFpsRange() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
@@ -1574,7 +1685,6 @@
 
     private void testPreviewFpsRangeByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
 
         // Test if the parameters exists and minimum fps <= maximum fps.
         int[] defaultFps = new int[2];
@@ -1789,7 +1899,6 @@
 
             // Make sure scene mode settings are consistent before preview and
             // after preview.
-            mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
             mCamera.startPreview();
             waitForPreviewDone();
             for (int i = 0; i < supportedSceneModes.size(); i++) {
@@ -1906,6 +2015,7 @@
         terminateMessageLooper();
     }
 
+    @UiThreadTest
     public void testGetParameterDuringFocus() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
@@ -1916,8 +2026,6 @@
 
     private void testGetParameterDuringFocusByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
-        mCamera.setErrorCallback(mErrorCallback);
         mCamera.startPreview();
         Parameters parameters = mCamera.getParameters();
         for (String focusMode: parameters.getSupportedFocusModes()) {
@@ -1941,6 +2049,7 @@
         terminateMessageLooper();
     }
 
+    @UiThreadTest
     public void testPreviewFormats() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
         for (int id = 0; id < nCameras; id++) {
@@ -1951,8 +2060,6 @@
 
     private void testPreviewFormatsByCamera(int cameraId) throws Exception {
         initializeMessageLooper(cameraId);
-        mCamera.setPreviewDisplay(getActivity().getSurfaceView().getHolder());
-        mCamera.setErrorCallback(mErrorCallback);
         Parameters parameters = mCamera.getParameters();
         for (int format: parameters.getSupportedPreviewFormats()) {
             Log.v(TAG, "Test preview format " + format);
@@ -1961,8 +2068,248 @@
             mCamera.setOneShotPreviewCallback(mPreviewCallback);
             mCamera.startPreview();
             waitForPreviewDone();
-            assertTrue(mPreviewCallbackResult);
+            assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
         }
         terminateMessageLooper();
     }
+
+    @UiThreadTest
+    public void testMultiCameraRelease() throws Exception {
+        // Verify that multiple cameras exist, and that they can be opened at the same time
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Checking pre-conditions.");
+        int nCameras = Camera.getNumberOfCameras();
+        if (nCameras < 2) {
+            Log.i(TAG, "Test multi-camera release: Skipping test because only 1 camera available");
+            return;
+        }
+
+        Camera testCamera0 = Camera.open(0);
+        Camera testCamera1 = null;
+        try {
+            testCamera1 = Camera.open(1);
+        } catch (RuntimeException e) {
+            // Can't open two cameras at once
+            Log.i(TAG, "testMultiCameraRelease: Skipping test because only 1 camera "+
+                  "could be opened at once. Second open threw: " + e);
+            testCamera0.release();
+            return;
+        }
+        testCamera0.release();
+        testCamera1.release();
+
+        // Start first camera
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Opening camera 0");
+        initializeMessageLooper(0);
+        SimplePreviewStreamCb callback0 = new SimplePreviewStreamCb(0);
+        mCamera.setPreviewCallback(callback0);
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Starting preview on camera 0");
+        mCamera.startPreview();
+        // Run preview for a bit
+        for (int f = 0; f < 100; f++) {
+            mPreviewDone.close();
+            assertTrue("testMultiCameraRelease: First camera preview timed out on frame " + f + "!",
+                       mPreviewDone.block( WAIT_FOR_COMMAND_TO_COMPLETE));
+        }
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Stopping preview on camera 0");
+        mCamera.stopPreview();
+        // Save message looper and camera to deterministically release them, instead
+        // of letting GC do it at some point.
+        Camera firstCamera = mCamera;
+        Looper firstLooper = mLooper;
+        //terminateMessageLooper(); // Intentionally not calling this
+
+        // Start second camera without releasing the first one (will
+        // set mCamera and mLooper to new objects)
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Opening camera 1");
+        initializeMessageLooper(1);
+        SimplePreviewStreamCb callback1 = new SimplePreviewStreamCb(1);
+        mCamera.setPreviewCallback(callback1);
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Starting preview on camera 1");
+        mCamera.startPreview();
+        // Run preview for a bit - GC of first camera instance should not impact the second's
+        // operation.
+        for (int f = 0; f < 100; f++) {
+            mPreviewDone.close();
+            assertTrue("testMultiCameraRelease: Second camera preview timed out on frame " + f + "!",
+                       mPreviewDone.block( WAIT_FOR_COMMAND_TO_COMPLETE));
+            if (f == 50) {
+                // Release first camera mid-preview, should cause no problems
+                if (LOGV) Log.v(TAG, "testMultiCameraRelease: Releasing camera 0");
+                firstCamera.release();
+            }
+        }
+        if (LOGV) Log.v(TAG, "testMultiCameraRelease: Stopping preview on camera 0");
+        mCamera.stopPreview();
+
+        firstLooper.quit();
+        terminateMessageLooper();
+    }
+
+    // This callback just signals on the condition variable, making it useful for checking that
+    // preview callbacks don't stop unexpectedly
+    private final class SimplePreviewStreamCb
+            implements android.hardware.Camera.PreviewCallback {
+        private int mId;
+        public SimplePreviewStreamCb(int id) {
+            mId = id;
+        }
+        public void onPreviewFrame(byte[] data, android.hardware.Camera camera) {
+            if (LOGV) Log.v(TAG, "Preview frame callback, id " + mId + ".");
+            mPreviewDone.open();
+        }
+    }
+
+    @UiThreadTest
+    public void testFocusAreas() throws Exception {
+        int nCameras = Camera.getNumberOfCameras();
+        for (int id = 0; id < nCameras; id++) {
+            Log.v(TAG, "Camera id=" + id);
+
+            initializeMessageLooper(id);
+            Parameters parameters = mCamera.getParameters();
+            int maxNumFocusAreas = parameters.getMaxNumFocusAreas();
+            assertTrue(maxNumFocusAreas >= 0);
+            if (maxNumFocusAreas > 0) {
+                List<String> focusModes = parameters.getSupportedFocusModes();
+                assertTrue(focusModes.contains(Parameters.FOCUS_MODE_AUTO));
+                testAreas(FOCUS_AREA, maxNumFocusAreas);
+            }
+            terminateMessageLooper();
+        }
+    }
+
+    @UiThreadTest
+    public void testMeteringAreas() throws Exception {
+        int nCameras = Camera.getNumberOfCameras();
+        for (int id = 0; id < nCameras; id++) {
+            Log.v(TAG, "Camera id=" + id);
+            initializeMessageLooper(id);
+            Parameters parameters = mCamera.getParameters();
+            int maxNumMeteringAreas = parameters.getMaxNumMeteringAreas();
+            assertTrue(maxNumMeteringAreas >= 0);
+            if (maxNumMeteringAreas > 0) {
+                testAreas(METERING_AREA, maxNumMeteringAreas);
+            }
+            terminateMessageLooper();
+        }
+    }
+
+    private void testAreas(int type, int maxNumAreas) throws Exception {
+        mCamera.startPreview();
+
+        // Test various valid cases.
+        testValidAreas(type, null);                                  // the default area
+        testValidAreas(type, makeAreas(-1000, -1000, 1000, 1000, 1)); // biggest area
+        testValidAreas(type, makeAreas(-500, -500, 500, 500, 1000)); // medium area & biggest weight
+        testValidAreas(type, makeAreas(0, 0, 1, 1, 1));              // smallest area
+
+        ArrayList<Area> areas = new ArrayList();
+        if (maxNumAreas > 1) {
+            // Test overlapped areas.
+            testValidAreas(type, makeAreas(-250, -250, 250, 250, 1, 0, 0, 500, 500, 2));
+            // Test completely disjoint areas.
+            testValidAreas(type, makeAreas(-250, -250, 0, 0, 1, 900, 900, 1000, 1000, 1));
+            // Test the maximum number of areas.
+            testValidAreas(type, makeAreas(-1000, -1000, 1000, 1000, 1000, maxNumAreas));
+        }
+
+        // Test various invalid cases.
+        testInvalidAreas(type, makeAreas(-1001, -1000, 1000, 1000, 1));    // left should >= -1000
+        testInvalidAreas(type, makeAreas(-1000, -1001, 1000, 1000, 1));    // top should >= -1000
+        testInvalidAreas(type, makeAreas(-1000, -1000, 1001, 1000, 1));    // right should <= 1000
+        testInvalidAreas(type, makeAreas(-1000, -1000, 1000, 1001, 1));    // bottom should <= 1000
+        testInvalidAreas(type, makeAreas(-1000, -1000, 1000, 1000, 0));    // weight should >= 1
+        testInvalidAreas(type, makeAreas(-1000, -1000, 1000, 1001, 1001)); // weight should <= 1000
+        testInvalidAreas(type, makeAreas(500, -1000, 500, 1000, 1));       // left should < right
+        testInvalidAreas(type, makeAreas(-1000, 500, 1000, 500, 1));       // top should < bottom
+        testInvalidAreas(type, makeAreas(500, -1000, 499, 1000, 1));       // left should < right
+        testInvalidAreas(type, makeAreas(-1000, 500, 100, 499, 1));        // top should < bottom
+        testInvalidAreas(type, makeAreas(-250, -250, 250, 250, -1));       // weight should >= 1
+        // Test when the number of areas exceeds maximum.
+        testInvalidAreas(type, makeAreas(-1000, -1000, 1000, 1000, 1000, maxNumAreas + 1));
+    }
+
+    private static ArrayList<Area> makeAreas(int left, int top, int right, int bottom, int weight) {
+        ArrayList<Area> areas = new ArrayList<Area>();
+        areas.add(new Area(new Rect(left, top, right, bottom), weight));
+        return areas;
+    }
+
+    private static ArrayList<Area> makeAreas(int left, int top, int right, int bottom,
+            int weight, int number) {
+        ArrayList<Area> areas = new ArrayList<Area>();
+        for (int i = 0; i < number; i++) {
+            areas.add(new Area(new Rect(left, top, right, bottom), weight));
+        }
+        return areas;
+    }
+
+    private static ArrayList<Area> makeAreas(int left1, int top1, int right1,
+            int bottom1, int weight1, int left2, int top2, int right2,
+            int bottom2, int weight2) {
+        ArrayList<Area> areas = new ArrayList<Area>();
+        areas.add(new Area(new Rect(left1, top1, right1, bottom1), weight1));
+        areas.add(new Area(new Rect(left2, top2, right2, bottom2), weight2));
+        return areas;
+    }
+
+    private void testValidAreas(int areaType, ArrayList<Area> areas) {
+        if (areaType == FOCUS_AREA) {
+            testValidFocusAreas(areas);
+        } else {
+            testValidMeteringAreas(areas);
+        }
+    }
+
+    private void testInvalidAreas(int areaType, ArrayList<Area> areas) {
+        if (areaType == FOCUS_AREA) {
+            testInvalidFocusAreas(areas);
+        } else {
+            testInvalidMeteringAreas(areas);
+        }
+    }
+
+    private void testValidFocusAreas(ArrayList<Area> areas) {
+        Parameters parameters = mCamera.getParameters();
+        parameters.setFocusAreas(areas);
+        mCamera.setParameters(parameters);
+        parameters = mCamera.getParameters();
+        assertEquals(areas, parameters.getFocusAreas());
+        mCamera.autoFocus(mAutoFocusCallback);
+        waitForFocusDone();
+    }
+
+    private void testInvalidFocusAreas(ArrayList<Area> areas) {
+        Parameters parameters = mCamera.getParameters();
+        List<Area> originalAreas = parameters.getFocusAreas();
+        try {
+            parameters.setFocusAreas(areas);
+            mCamera.setParameters(parameters);
+            fail("Should throw exception when focus area is invalid.");
+        } catch (RuntimeException e) {
+            parameters = mCamera.getParameters();
+            assertEquals(originalAreas, parameters.getFocusAreas());
+        }
+    }
+
+    private void testValidMeteringAreas(ArrayList<Area> areas) {
+        Parameters parameters = mCamera.getParameters();
+        parameters.setMeteringAreas(areas);
+        mCamera.setParameters(parameters);
+        parameters = mCamera.getParameters();
+        assertEquals(areas, parameters.getMeteringAreas());
+    }
+
+    private void testInvalidMeteringAreas(ArrayList<Area> areas) {
+        Parameters parameters = mCamera.getParameters();
+        List<Area> originalAreas = parameters.getMeteringAreas();
+        try {
+            parameters.setMeteringAreas(areas);
+            mCamera.setParameters(parameters);
+            fail("Should throw exception when metering area is invalid.");
+        } catch (RuntimeException e) {
+            parameters = mCamera.getParameters();
+            assertEquals(originalAreas, parameters.getMeteringAreas());
+        }
+    }
 }
diff --git a/tests/tests/jni/libjnitest/Android.mk b/tests/tests/jni/libjnitest/Android.mk
index 84856b3..d7d1bad 100644
--- a/tests/tests/jni/libjnitest/Android.mk
+++ b/tests/tests/jni/libjnitest/Android.mk
@@ -25,9 +25,6 @@
 # Don't include this package in any configuration by default.
 LOCAL_MODULE_TAGS := optional
 
-# This isn't part of the system, so don't prelink it.
-LOCAL_PRELINK_MODULE := false
-
 LOCAL_SRC_FILES := \
 	android_jni_cts_InstanceNonce.c \
 	android_jni_cts_JniCTest.c \
diff --git a/tests/tests/media/src/android/media/cts/AudioEffectTest.java b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
index 0aaf11f..41f3055 100644
--- a/tests/tests/media/src/android/media/cts/AudioEffectTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
@@ -566,7 +566,7 @@
             byte[] param = mEffect.intToByteArray(PresetReverb.PARAM_PRESET);
             byte[] value = new byte[2];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             short preset = PresetReverb.PRESET_SMALLROOM;
             if (mEffect.byteArrayToShort(value) == preset) {
                 preset = PresetReverb.PRESET_MEDIUMROOM;
@@ -575,7 +575,7 @@
             status = mEffect.setParameter(param, value);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             assertEquals("get/set Parameter failed", preset,
                     mEffect.byteArrayToShort(value));
 
@@ -609,7 +609,7 @@
             int param = EnvironmentalReverb.PARAM_DECAY_TIME;
             int[] value = new int[1];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             int time = 500;
             if (value[0] == time) {
                 time = 1000;
@@ -617,7 +617,7 @@
             status = mEffect.setParameter(param, time);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             assertTrue("got incorrect decay time",
                     ((float)value[0] > (float)(time / DELAY_TOLERANCE)) &&
                     ((float)value[0] < (float)(time * DELAY_TOLERANCE)));
@@ -652,7 +652,7 @@
             int param = PresetReverb.PARAM_PRESET;
             short[] value = new short[1];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             short preset = PresetReverb.PRESET_SMALLROOM;
             if (value[0] == preset) {
                 preset = PresetReverb.PRESET_MEDIUMROOM;
@@ -660,7 +660,7 @@
             status = mEffect.setParameter(param, preset);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             assertEquals("get/set Parameter failed", preset, value[0]);
 
         } catch (IllegalArgumentException e) {
@@ -693,7 +693,7 @@
             int param = EnvironmentalReverb.PARAM_DECAY_TIME;
             byte[] value = new byte[4];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             int time = 500;
             if (mEffect.byteArrayToInt(value) == time) {
                 time = 1000;
@@ -702,7 +702,7 @@
             status = mEffect.setParameter(param, value);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             int time2 = mEffect.byteArrayToInt(value);
             assertTrue("got incorrect decay time",
                     ((float)time2 > (float)(time / DELAY_TOLERANCE)) &&
@@ -739,7 +739,7 @@
             int[] value = new int[1];
             param[0] = EnvironmentalReverb.PARAM_DECAY_TIME;
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             int[] time = new int[1];
             time[0] = 500;
             if (value[0] == time[0]) {
@@ -748,7 +748,7 @@
             status = mEffect.setParameter(param, time);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             assertTrue("got incorrect decay time",
                     ((float)value[0] > (float)(time[0] / DELAY_TOLERANCE)) &&
                     ((float)value[0] < (float)(time[0] * DELAY_TOLERANCE)));
@@ -785,7 +785,7 @@
             param[0] = PresetReverb.PARAM_PRESET;
             short[] value = new short[1];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             short[] preset = new short[1];
             preset[0] = PresetReverb.PRESET_SMALLROOM;
             if (value[0] == preset[0]) {
@@ -794,7 +794,7 @@
             status = mEffect.setParameter(param, preset);
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             assertEquals("get/set Parameter failed", preset[0], value[0]);
 
         } catch (IllegalArgumentException e) {
@@ -828,7 +828,7 @@
             param[0] = EnvironmentalReverb.PARAM_DECAY_TIME;
             byte[] value = new byte[4];
             int status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 1 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 1 failed", AudioEffect.isError(status));
             int time = 500;
             if (mEffect.byteArrayToInt(value) == time) {
                 time = 1000;
@@ -837,7 +837,7 @@
             status = mEffect.setParameter(param, mEffect.intToByteArray(time));
             assertEquals("setParameter failed", AudioEffect.SUCCESS, status);
             status = mEffect.getParameter(param, value);
-            assertEquals("getParameter 2 failed", AudioEffect.SUCCESS, status);
+            assertFalse("getParameter 2 failed", AudioEffect.isError(status));
             int time2 = mEffect.byteArrayToInt(value);
             assertTrue("got incorrect decay time",
                     ((float)time2 > (float)(time / DELAY_TOLERANCE)) &&
@@ -1018,8 +1018,8 @@
 
             short[] value = new short[1];
             status = effect2.getParameter(PresetReverb.PARAM_PRESET, value);
-            assertEquals("Effect2 getParameter failed",
-                    AudioEffect.SUCCESS, status);
+            assertFalse("Effect2 getParameter failed",
+                    AudioEffect.isError(status));
             assertEquals("Effect1 changed parameter", PresetReverb.PRESET_SMALLROOM
                     , value[0]);
 
@@ -1186,7 +1186,7 @@
             byte[] reply = new byte[4];
             // command 3 is ENABLE
             int status = mEffect.command(3, cmd, reply);
-            assertEquals("command failed", AudioEffect.SUCCESS, status);
+            assertFalse("command failed", AudioEffect.isError(status));
             assertTrue("effect not enabled", mEffect.getEnabled());
 
         } catch (IllegalStateException e) {
diff --git a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
index 4b0728b..e2cbebb 100644
--- a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
+++ b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
@@ -21,7 +21,6 @@
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
 
-import android.content.pm.PackageManager;
 import android.hardware.Camera;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
@@ -236,16 +235,6 @@
         )
     })
     public void testGet() {
-        /*
-         * Device may not have rear camera for checkGet(-1).
-         * Checking PackageManager.FEATURE_CAMERA is included or not to decide the flow.
-         * Continue if the feature is included.
-         * Otherwise, exit test.
-         */
-        PackageManager pm = mContext.getPackageManager();
-        if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
-            return;
-        }
         checkGet(-1);
     }
 
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java b/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
index 196e102..6b9b985 100644
--- a/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
+++ b/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
@@ -16,12 +16,13 @@
 
 package android.net.cts;
 
-import android.net.NetworkInfo.DetailedState;
-import android.test.AndroidTestCase;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 
+import android.net.NetworkInfo.DetailedState;
+import android.test.AndroidTestCase;
+
 @TestTargetClass(DetailedState.class)
 public class NetworkInfo_DetailedStateTest extends AndroidTestCase {
 
@@ -52,7 +53,7 @@
     )
     public void testValues() {
         DetailedState[] expected = DetailedState.values();
-        assertEquals(10, expected.length);
+        assertEquals(11, expected.length);
         assertEquals(DetailedState.IDLE, expected[0]);
         assertEquals(DetailedState.SCANNING, expected[1]);
         assertEquals(DetailedState.CONNECTING, expected[2]);
@@ -63,6 +64,7 @@
         assertEquals(DetailedState.DISCONNECTING, expected[7]);
         assertEquals(DetailedState.DISCONNECTED, expected[8]);
         assertEquals(DetailedState.FAILED, expected[9]);
+        assertEquals(DetailedState.BLOCKED, expected[10]);
     }
 
 }
diff --git a/tests/tests/os/src/android/os/cts/ProcessTest.java b/tests/tests/os/src/android/os/cts/ProcessTest.java
index 6216f06..4f61688 100644
--- a/tests/tests/os/src/android/os/cts/ProcessTest.java
+++ b/tests/tests/os/src/android/os/cts/ProcessTest.java
@@ -26,7 +26,6 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestStatus;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
@@ -235,13 +234,7 @@
         }
 
         assertTrue(time > 0);
-
-        if(servicePid == Process.myPid()) {
-            assertFalse(Process.supportsProcesses());
-            return;
-        } else {
-            assertTrue(Process.supportsProcesses());
-        }
+        assertTrue(servicePid != Process.myPid());
 
         Process.killProcess(servicePid);
         synchronized (mSync) {
diff --git a/tests/tests/permission/jni/Android.mk b/tests/tests/permission/jni/Android.mk
index 0891a72..44e742e 100644
--- a/tests/tests/permission/jni/Android.mk
+++ b/tests/tests/permission/jni/Android.mk
@@ -21,9 +21,6 @@
 # Don't include this package in any configuration by default.
 LOCAL_MODULE_TAGS := optional
 
-# This isn't part of the system, so don't prelink it.
-LOCAL_PRELINK_MODULE := false
-
 LOCAL_SRC_FILES := \
 		CtsPermissionsJniOnLoad.cpp \
 		android_permission_cts_FileUtils.cpp
diff --git a/tests/tests/permission/jni/android_permission_cts_FileUtils.cpp b/tests/tests/permission/jni/android_permission_cts_FileUtils.cpp
index 1666d50..c658af6 100644
--- a/tests/tests/permission/jni/android_permission_cts_FileUtils.cpp
+++ b/tests/tests/permission/jni/android_permission_cts_FileUtils.cpp
@@ -21,7 +21,6 @@
 #include <grp.h>
 #include <pwd.h>
 
-static jclass gFileStatusClass;
 static jfieldID gFileStatusDevFieldID;
 static jfieldID gFileStatusInoFieldID;
 static jfieldID gFileStatusModeFieldID;
@@ -101,19 +100,19 @@
 {
     jclass clazz = env->FindClass("android/permission/cts/FileUtils");
 
-    gFileStatusClass = env->FindClass("android/permission/cts/FileUtils$FileStatus");
-    gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
-    gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
-    gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
-    gFileStatusNlinkFieldID = env->GetFieldID(gFileStatusClass, "nlink", "I");
-    gFileStatusUidFieldID = env->GetFieldID(gFileStatusClass, "uid", "I");
-    gFileStatusGidFieldID = env->GetFieldID(gFileStatusClass, "gid", "I");
-    gFileStatusSizeFieldID = env->GetFieldID(gFileStatusClass, "size", "J");
-    gFileStatusBlksizeFieldID = env->GetFieldID(gFileStatusClass, "blksize", "I");
-    gFileStatusBlocksFieldID = env->GetFieldID(gFileStatusClass, "blocks", "J");
-    gFileStatusAtimeFieldID = env->GetFieldID(gFileStatusClass, "atime", "J");
-    gFileStatusMtimeFieldID = env->GetFieldID(gFileStatusClass, "mtime", "J");
-    gFileStatusCtimeFieldID = env->GetFieldID(gFileStatusClass, "ctime", "J");
+    jclass fileStatusClass = env->FindClass("android/permission/cts/FileUtils$FileStatus");
+    gFileStatusDevFieldID = env->GetFieldID(fileStatusClass, "dev", "I");
+    gFileStatusInoFieldID = env->GetFieldID(fileStatusClass, "ino", "I");
+    gFileStatusModeFieldID = env->GetFieldID(fileStatusClass, "mode", "I");
+    gFileStatusNlinkFieldID = env->GetFieldID(fileStatusClass, "nlink", "I");
+    gFileStatusUidFieldID = env->GetFieldID(fileStatusClass, "uid", "I");
+    gFileStatusGidFieldID = env->GetFieldID(fileStatusClass, "gid", "I");
+    gFileStatusSizeFieldID = env->GetFieldID(fileStatusClass, "size", "J");
+    gFileStatusBlksizeFieldID = env->GetFieldID(fileStatusClass, "blksize", "I");
+    gFileStatusBlocksFieldID = env->GetFieldID(fileStatusClass, "blocks", "J");
+    gFileStatusAtimeFieldID = env->GetFieldID(fileStatusClass, "atime", "J");
+    gFileStatusMtimeFieldID = env->GetFieldID(fileStatusClass, "mtime", "J");
+    gFileStatusCtimeFieldID = env->GetFieldID(fileStatusClass, "ctime", "J");
 
     return env->RegisterNatives(clazz, gMethods, 
             sizeof(gMethods) / sizeof(JNINativeMethod)); 
diff --git a/tests/tests/permission/src/android/permission/cts/DebuggableTest.java b/tests/tests/permission/src/android/permission/cts/DebuggableTest.java
index fe4ed57..d77e13e 100644
--- a/tests/tests/permission/src/android/permission/cts/DebuggableTest.java
+++ b/tests/tests/permission/src/android/permission/cts/DebuggableTest.java
@@ -20,7 +20,9 @@
 import android.content.pm.PackageManager;
 import android.test.AndroidTestCase;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Verify that pre-installed packages don't have the debuggable
@@ -30,13 +32,16 @@
 public class DebuggableTest extends AndroidTestCase {
 
     public void testNoDebuggable() {
+        Set<String> debuggableApps = new HashSet<String>();
         List<ApplicationInfo> apps = getContext()
                 .getPackageManager()
                 .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
         for (ApplicationInfo app : apps) {
             String appName = app.packageName;
-            assertTrue("Package " + appName + " is marked as debuggable.",
-                    (app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0);
+            if ((app.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE) {
+                debuggableApps.add(appName);
+            }
         }
+        assertTrue("Packages marked debuggable: " + debuggableApps, debuggableApps.isEmpty());
     }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
index 3cbb362..ea6b4d1 100644
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -21,6 +21,7 @@
 import android.os.Environment;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 
 import java.io.File;
 import java.io.FileFilter;
@@ -36,9 +37,9 @@
  *
  * TODO: Combine this file with {@link android.os.cts.FileAccessPermissionTest}
  */
-@MediumTest
 public class FileSystemPermissionTest extends AndroidTestCase {
 
+    @MediumTest
     public void testCreateFileHasSanePermissions() throws Exception {
         File myFile = new File(getContext().getFilesDir(), "hello");
         FileOutputStream stream = new FileOutputStream(myFile);
@@ -59,6 +60,7 @@
         }
     }
 
+    @MediumTest
     public void testCreateDirectoryHasSanePermissions() throws Exception {
         File myDir = new File(getContext().getFilesDir(), "helloDirectory");
         assertTrue(myDir.mkdir());
@@ -79,6 +81,7 @@
         }
     }
 
+    @MediumTest
     public void testOtherApplicationDirectoriesAreNotWritable() throws Exception {
         List<ApplicationInfo> apps = getContext()
                 .getPackageManager()
@@ -91,36 +94,44 @@
         }
     }
 
+    @MediumTest
     public void testApplicationParentDirectoryNotWritable() throws Exception {
         String myDataDir = getContext().getApplicationInfo().dataDir;
         File parentDir = new File(myDataDir).getParentFile();
         assertDirectoryNotWritable(parentDir);
     }
 
+    @MediumTest
     public void testDataDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(Environment.getDataDirectory());
     }
 
+    @MediumTest
     public void testAndroidRootDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(Environment.getRootDirectory());
     }
 
+    @MediumTest
     public void testDownloadCacheDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(Environment.getDownloadCacheDirectory());
     }
 
+    @MediumTest
     public void testRootDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(new File("/"));
     }
 
+    @MediumTest
     public void testDevDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(new File("/dev"));
     }
 
+    @MediumTest
     public void testProcDirectoryNotWritable() throws Exception {
         assertDirectoryNotWritable(new File("/proc"));
     }
 
+    @MediumTest
     public void testDevMemSane() throws Exception {
         File f = new File("/dev/mem");
         assertFalse(f.canRead());
@@ -128,6 +139,7 @@
         assertFalse(f.canExecute());
     }
 
+    @MediumTest
     public void testDevkmemSane() throws Exception {
         File f = new File("/dev/kmem");
         assertFalse(f.canRead());
@@ -135,6 +147,7 @@
         assertFalse(f.canExecute());
     }
 
+    @MediumTest
     public void testDevPortSane() throws Exception {
         File f = new File("/dev/port");
         assertFalse(f.canRead());
@@ -163,6 +176,7 @@
      * test only.  Writable directories within unreadable subdirectories
      * will NOT be detected by this code.
      */
+    @LargeTest
     public void testAllOtherDirectoriesNotWritable() throws Exception {
         File start = new File("/");
         assertDirectoryAndSubdirectoriesNotWritable(start);
@@ -193,6 +207,7 @@
      * poke around in there looking for bad directories.  There has to be
      * a better way...
      */
+    @LargeTest
     public void testOtherRandomDirectoriesNotWritable() throws Exception {
         for (String dir : OTHER_RANDOM_DIRECTORIES) {
             File start = new File(dir);
@@ -200,6 +215,7 @@
         }
     }
 
+    @LargeTest
     public void testAllFilesInSysAreNotWritable() throws Exception {
         assertAllFilesInDirAndSubDirAreNotWritable(new File("/sys"));
     }
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
index 98792e7..00bb47d 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_AlbumsTest.java
@@ -96,7 +96,8 @@
                     null);
             assertEquals(1, c.getCount());
             c.moveToFirst();
-            assertTrue(c.getLong(c.getColumnIndex(Albums._ID)) > 0);
+            long id = c.getLong(c.getColumnIndex(Albums._ID));
+            assertTrue(id > 0);
             assertEquals(Audio1.ALBUM, c.getString(c.getColumnIndex(Albums.ALBUM)));
             assertNull(c.getString(c.getColumnIndex(Albums.ALBUM_ART)));
             assertNotNull(c.getString(c.getColumnIndex(Albums.ALBUM_KEY)));
@@ -140,6 +141,20 @@
                 // expected
             }
 
+            // test filtering
+            Uri filterUri = audioAlbumsUri.buildUpon()
+                .appendQueryParameter("filter", Audio1.ARTIST).build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            long fid = c.getLong(c.getColumnIndex(Albums._ID));
+            assertTrue(id == fid);
+            c.close();
+
+            filterUri = audioAlbumsUri.buildUpon().appendQueryParameter("filter", "xyzfoo").build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(0, c.getCount());
+            c.close();
         } finally {
             mContentResolver.delete(audioMediaUri, null, null);
         }
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_ArtistsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_ArtistsTest.java
index 917aa3d..a7ef2d1 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_ArtistsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_ArtistsTest.java
@@ -91,7 +91,8 @@
             c.moveToFirst();
 
             assertEquals(Audio1.ARTIST, c.getString(c.getColumnIndex(Artists.ARTIST)));
-            assertTrue(c.getLong(c.getColumnIndex(Artists._ID)) > 0);
+            long id = c.getLong(c.getColumnIndex(Artists._ID));
+            assertTrue(id > 0);
             assertNotNull(c.getString(c.getColumnIndex(Artists.ARTIST_KEY)));
             assertEquals(1, c.getInt(c.getColumnIndex(Artists.NUMBER_OF_ALBUMS)));
             assertEquals(1, c.getInt(c.getColumnIndex(Artists.NUMBER_OF_TRACKS)));
@@ -114,6 +115,21 @@
             } catch (UnsupportedOperationException e) {
                 // expected
             }
+
+            // test filtering
+            Uri filterUri = artistsUri.buildUpon()
+                .appendQueryParameter("filter", Audio1.ARTIST).build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            long fid = c.getLong(c.getColumnIndex(Artists._ID));
+            assertTrue(id == fid);
+            c.close();
+
+            filterUri = artistsUri.buildUpon().appendQueryParameter("filter", "xyzfoo").build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(0, c.getCount());
+            c.close();
         } finally {
             mContentResolver.delete(uri, null, null);
         }
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Genres_MembersTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Genres_MembersTest.java
index 66ac599..5ce8a28 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Genres_MembersTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Genres_MembersTest.java
@@ -95,8 +95,6 @@
                 null));
     }
 
-    @ToBeFixed(bug = "", explanation = "The result cursor of query for all columns does not "
-            + "contain the column Members.ALBUM_ART, Members.GENRE_ID and  Members.AUDIO_ID.")
     public void testStoreAudioGenresMembersExternal() {
         ContentValues values = new ContentValues();
         values.put(Genres.NAME, Audio1.GENRE);
@@ -105,8 +103,12 @@
         c.moveToFirst();
 
         long genreId = c.getLong(c.getColumnIndex(Genres._ID));
+        long genre2Id = -1; // used later
         c.close();
 
+        // verify that the Uri has the correct format and genre value
+        assertEquals(uri.toString(), "content://media/external/audio/genres/" + genreId);
+
         // insert audio as the member of the genre
         values.clear();
         values.put(Members.AUDIO_ID, mAudioIdOfJam);
@@ -115,36 +117,15 @@
         assertNotNull(mContentResolver.insert(membersUri, values));
 
         try {
-            // query
+            // query, slow path
             c = mContentResolver.query(membersUri, null, null, null, null);
-            // the ALBUM_ART column does not exist
-            try {
-                c.getColumnIndexOrThrow(Members.ALBUM_ART);
-                fail("Should throw IllegalArgumentException because there is no column with name"
-                        + " \"Members.ALBUM_ART\" in the table");
-            } catch (IllegalArgumentException e) {
-                // expected
-            }
-
-            try {
-                c.getColumnIndexOrThrow(Members.AUDIO_ID);
-                fail("Should throw IllegalArgumentException because there is no column with name"
-                        + " \"Members.AUDIO_ID\" in the table");
-            } catch (IllegalArgumentException e) {
-                // expected
-            }
-
-            try {
-                c.getColumnIndexOrThrow(Members.GENRE_ID);
-                fail("Should throw IllegalArgumentException because there is no column with name"
-                        + " \"Members.GENRE_ID\" in the table");
-            } catch (IllegalArgumentException e) {
-                // expected
-            }
 
             assertEquals(1, c.getCount());
             c.moveToFirst();
-            assertTrue(c.getLong(c.getColumnIndex(Members._ID)) > 0);
+
+            assertEquals(mAudioIdOfJam, c.getLong(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(genreId, c.getLong(c.getColumnIndex(Members.GENRE_ID)));
+            assertEquals(mAudioIdOfJam, c.getLong(c.getColumnIndex(Members._ID)));
             assertEquals(Audio1.EXTERNAL_DATA, c.getString(c.getColumnIndex(Members.DATA)));
             assertTrue(c.getLong(c.getColumnIndex(Members.DATE_ADDED)) > 0);
             assertEquals(Audio1.DATE_MODIFIED, c.getLong(c.getColumnIndex(Members.DATE_MODIFIED)));
@@ -175,6 +156,89 @@
             assertNotNull(titleKey);
             c.close();
 
+            // query again, fast path
+            c = mContentResolver.query(membersUri,
+                    new String[] { Members.AUDIO_ID, Members.GENRE_ID},
+                    null, null, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            assertEquals(mAudioIdOfJam, c.getLong(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(genreId, c.getLong(c.getColumnIndex(Members.GENRE_ID)));
+            c.close();
+
+            // Query with a constraint on _id. Note that _id corresponds to the _id
+            // column in the audio table, not the one in the audio_genres_map table.
+            // We need to preserve this behavior for backward compatibility.
+            c = mContentResolver.query(membersUri, null,
+                    Members._ID + "=?", new String[] {Long.toString(mAudioIdOfJam)}, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            assertEquals(mAudioIdOfJam, c.getLong(c.getColumnIndex(Members._ID)));
+            c.close();
+
+            // Query members across all genres
+            Uri allMembersUri = Uri.parse("content://media/external/audio/genres/all/members");
+            c = mContentResolver.query(allMembersUri, null, null, null, null);
+            int colidx = c.getColumnIndex(Members.AUDIO_ID);
+            int jamcnt = 0;
+            // The song should appear only once, for the genre we used when inserting it
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mAudioIdOfJam) {
+                    jamcnt++;
+                    assertEquals(genreId, c.getLong(c.getColumnIndex(Members.GENRE_ID)));
+                }
+            }
+            assertEquals(1, jamcnt);
+            c.close();
+
+            // Query the same Uri, but add a where clause to restrict it to the one entry we added
+            c = mContentResolver.query(allMembersUri, null,
+                    Members.AUDIO_ID + "=?", new String[] {Long.toString(mAudioIdOfJam)}, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            assertEquals(genreId, c.getLong(c.getColumnIndex(Members.GENRE_ID)));
+            assertEquals(mAudioIdOfJam, c.getLong(c.getColumnIndex(Members.AUDIO_ID)));
+            c.close();
+
+            // create another genre
+            values.clear();
+            values.put(Genres.NAME, Audio1.GENRE + "-2");
+            uri = mContentResolver.insert(Genres.EXTERNAL_CONTENT_URI, values);
+            c = mContentResolver.query(uri, null, null, null, null);
+            c.moveToFirst();
+            genre2Id = c.getLong(c.getColumnIndex(Genres._ID));
+            c.close();
+
+            // insert the song into the second genre
+            values.clear();
+            values.put(Members.AUDIO_ID, mAudioIdOfJam);
+            Uri members2Uri = Members.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME,
+                genre2Id);
+            assertNotNull(mContentResolver.insert(members2Uri, values));
+
+            // Query members across all genres again
+            c = mContentResolver.query(allMembersUri, null, null, null, null);
+            colidx = c.getColumnIndex(Members.AUDIO_ID);
+            int jamcnt1 = 0;
+            int jamcnt2 = 0;
+            // This time the song should appear twice, once for each genre
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mAudioIdOfJam) {
+                    long g = c.getLong(c.getColumnIndex(Members.GENRE_ID));
+                    if (g == genreId) {
+                        jamcnt1++;
+                    } else if (g == genre2Id) {
+                        jamcnt2++;
+                    } else {
+                        fail("wrong genre found");
+                    }
+                }
+            }
+            assertEquals(1, jamcnt1);
+            assertEquals(1, jamcnt2);
+            c.close();
+
+
             // update the member
             values.clear();
             values.put(Members.AUDIO_ID, mAudioIdOfJamLive);
@@ -186,17 +250,20 @@
                 // expected
             }
 
-            // delete the member
-            try {
-                mContentResolver.delete(membersUri, null, null);
-                fail("Should throw SQLException because there is no column with name "
-                        + "\"Members.GENRE_ID\" in the table");
-            } catch (SQLException e) {
-                // expected
-            }
+            // Delete the members, note that this does not delete the genre itself
+            assertEquals(1, mContentResolver.delete(membersUri, null, null)); // check number of rows deleted
+
+            // verify the genre is now empty
+            c = mContentResolver.query(membersUri, null, null, null, null);
+            assertEquals(0, c.getCount());
+            c.close();
+
         } finally {
             // the members are deleted when deleting the genre which they belong to
             mContentResolver.delete(Genres.EXTERNAL_CONTENT_URI, Genres._ID + "=" + genreId, null);
+            if (genre2Id >= 0) {
+                mContentResolver.delete(Genres.EXTERNAL_CONTENT_URI, Genres._ID + "=" + genre2Id, null);
+            }
             c = mContentResolver.query(membersUri, null, null, null, null);
             assertEquals(0, c.getCount());
             c.close();
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_MediaTest.java
index 29b270e..51f5e87 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_MediaTest.java
@@ -76,12 +76,10 @@
                 null, null));
     }
 
-    @ToBeFixed(bug = "", explanation = "The column Media.ALBUM_ART does not exist.")
     public void testStoreAudioMediaInternal() {
         testStoreAudioMedia(true);
     }
 
-    @ToBeFixed(bug = "", explanation = "The column Media.ALBUM_ART does not exist.")
     public void testStoreAudioMediaExternal() {
         testStoreAudioMedia(false);
     }
@@ -102,7 +100,8 @@
             Cursor c = mContentResolver.query(uri, null, null, null, null);
             assertEquals(1, c.getCount());
             c.moveToFirst();
-            assertTrue(c.getLong(c.getColumnIndex(Media._ID)) > 0);
+            long id = c.getLong(c.getColumnIndex(Media._ID));
+            assertTrue(id > 0);
             String expected = isInternal ? Audio1.INTERNAL_DATA : Audio1.EXTERNAL_DATA;
             assertEquals(expected, c.getString(c.getColumnIndex(Media.DATA)));
             assertTrue(c.getLong(c.getColumnIndex(Media.DATE_ADDED)) > 0);
@@ -131,14 +130,6 @@
             assertEquals(Audio1.YEAR, c.getInt(c.getColumnIndex(Media.YEAR)));
             String titleKey = c.getString(c.getColumnIndex(Media.TITLE_KEY));
             assertNotNull(titleKey);
-            // the ALBUM_ART column does not exist
-            try {
-                c.getColumnIndexOrThrow(Media.ALBUM_ART);
-                fail("Should throw IllegalArgumentException because there is no column with name"
-                        + " \"Media.ALBUM_ART\" in the table");
-            } catch (IllegalArgumentException e) {
-                // expected
-            }
             c.close();
 
             // update
@@ -151,6 +142,8 @@
             c = mContentResolver.query(uri, null, null, null, null);
             assertEquals(1, c.getCount());
             c.moveToFirst();
+            long id2 = c.getLong(c.getColumnIndex(Media._ID));
+            assertTrue(id == id2);
             expected = isInternal ? Audio2.INTERNAL_DATA : Audio2.EXTERNAL_DATA;
             assertEquals(expected, c.getString(c.getColumnIndex(Media.DATA)));
             assertEquals(Audio2.DATE_MODIFIED, c.getLong(c.getColumnIndex(Media.DATE_MODIFIED)));
@@ -175,6 +168,22 @@
             assertEquals(Audio2.YEAR, c.getInt(c.getColumnIndex(Media.YEAR)));
             assertTrue(titleKey.equals(c.getString(c.getColumnIndex(Media.TITLE_KEY))));
             c.close();
+
+            // test filtering
+            Uri baseUri = isInternal ? Media.INTERNAL_CONTENT_URI : Media.EXTERNAL_CONTENT_URI;
+            Uri filterUri = baseUri.buildUpon()
+                .appendQueryParameter("filter", Audio2.ARTIST).build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(1, c.getCount());
+            c.moveToFirst();
+            long fid = c.getLong(c.getColumnIndex(Media._ID));
+            assertTrue(id == fid);
+            c.close();
+
+            filterUri = baseUri.buildUpon().appendQueryParameter("filter", "xyzfoo").build();
+            c = mContentResolver.query(filterUri, null, null, null, null);
+            assertEquals(0, c.getCount());
+            c.close();
         } finally {
             // delete
             int result = mContentResolver.delete(uri, null, null);
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
index 36d4303..beb775f 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Playlists_MembersTest.java
@@ -24,6 +24,7 @@
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
+import android.provider.MediaStore;
 import android.provider.MediaStore.Audio.Media;
 import android.provider.MediaStore.Audio.Playlists;
 import android.provider.MediaStore.Audio.Playlists.Members;
@@ -147,6 +148,10 @@
         Cursor c = mContentResolver.query(uri, null, null, null, null);
         c.moveToFirst();
         long playlistId = c.getLong(c.getColumnIndex(Playlists._ID));
+        long playlist2Id = -1; // used later
+
+        // verify that the Uri has the correct format and playlist value
+        assertEquals(uri.toString(), "content://media/external/audio/playlists/" + playlistId);
 
         // insert audio as the member of the playlist
         values.clear();
@@ -239,13 +244,117 @@
             assertNotNull(c.getString(c.getColumnIndex(Members.TITLE_KEY)));
             c.close();
 
-            // delete the member
+            // update the member back to its original state
+            values.clear();
+            values.put(Members.PLAY_ORDER, 1);
+            values.put(Members.AUDIO_ID, mIdOfAudio1);
+            result = mContentResolver.update(membersUri, values, Members.AUDIO_ID + "="
+                    + mIdOfAudio2, null);
+            assertEquals(1, result);
+
+            // insert another member into the playlist
+            values.clear();
+            values.put(Members.AUDIO_ID, mIdOfAudio2);
+            values.put(Members.PLAY_ORDER, 2);
+            Uri audioUri2 = mContentResolver.insert(membersUri, values);
+            // the playlist should now have id1 at position 1 and id2 at position2, check that
+            c = mContentResolver.query(membersUri, new String[] { Members.AUDIO_ID, Members.PLAY_ORDER }, null, null, Members.PLAY_ORDER);
+            assertEquals(2, c.getCount());
+            c.moveToFirst();
+            assertEquals(mIdOfAudio1, c.getInt(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(1, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.moveToNext();
+            assertEquals(mIdOfAudio2, c.getInt(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(2, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.close();
+
+            // swap the items around
+            assertTrue(MediaStore.Audio.Playlists.Members.moveItem(mContentResolver, playlistId, 2, 1));
+
+            // check the new positions
+            c = mContentResolver.query(membersUri, new String[] { Members.AUDIO_ID, Members.PLAY_ORDER }, null, null, Members.PLAY_ORDER);
+            assertEquals(2, c.getCount());
+            c.moveToFirst();
+            assertEquals(mIdOfAudio2, c.getInt(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(1, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.moveToNext();
+            assertEquals(mIdOfAudio1, c.getInt(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(2, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.close();
+
+            // swap the items around in the other direction
+            assertTrue(MediaStore.Audio.Playlists.Members.moveItem(mContentResolver, playlistId, 1, 2));
+
+            // check the positions again
+            c = mContentResolver.query(membersUri, new String[] { Members.AUDIO_ID, Members.PLAY_ORDER }, null, null, Members.PLAY_ORDER);
+            assertEquals(2, c.getCount());
+            c.moveToFirst();
+            assertEquals(mIdOfAudio1, c.getLong(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(1, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.moveToNext();
+            assertEquals(mIdOfAudio2, c.getLong(c.getColumnIndex(Members.AUDIO_ID)));
+            assertEquals(2, c.getInt(c.getColumnIndex(Members.PLAY_ORDER)));
+            c.close();
+
+            // create another playlist
+            values.clear();
+            values.put(Playlists.NAME, "My favourites 2");
+            values.put(Playlists.DATA, "");
+            values.put(Playlists.DATE_ADDED, dateAdded);
+            values.put(Playlists.DATE_MODIFIED, dateModified);
+            // insert
+            uri = mContentResolver.insert(Playlists.EXTERNAL_CONTENT_URI, values);
+            assertNotNull(uri);
+            c = mContentResolver.query(uri, null, null, null, null);
+            c.moveToFirst();
+            playlist2Id = c.getLong(c.getColumnIndex(Playlists._ID));
+            c.close();
+
+            // insert audio into 2nd playlist
+            values.clear();
+            values.put(Members.AUDIO_ID, mIdOfAudio1);
+            values.put(Members.PLAY_ORDER, 1);
+            Uri members2Uri = Members.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME,
+                    playlist2Id);
+            Uri audio2Uri = mContentResolver.insert(members2Uri, values);
+
+            // check that the audio exists in both playlist
+            c = mContentResolver.query(membersUri, null, null, null, null);
+            assertEquals(2, c.getCount());
+            int cnt = 0;
+            int colidx = c.getColumnIndex(Members.AUDIO_ID);
+            assertTrue(colidx >= 0);
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mIdOfAudio1) {
+                    cnt++;
+                }
+            }
+            assertEquals(1, cnt);
+            c.close();
+            c = mContentResolver.query(members2Uri, null, null, null, null);
+            assertEquals(1, c.getCount());
+            cnt = 0;
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mIdOfAudio1) {
+                    cnt++;
+                }
+            }
+            assertEquals(1, cnt);
+            c.close();
+
+            // delete the members
             result = mContentResolver.delete(membersUri, null, null);
+            assertEquals(2, result);
+            result = mContentResolver.delete(members2Uri, null, null);
             assertEquals(1, result);
         } finally {
-            // delete the playlist
+            // delete the playlists
             mContentResolver.delete(Playlists.EXTERNAL_CONTENT_URI,
                     Playlists._ID + "=" + playlistId, null);
+            if (playlist2Id >= 0) {
+                mContentResolver.delete(Playlists.EXTERNAL_CONTENT_URI,
+                        Playlists._ID + "=" + playlist2Id, null);
+            }
         }
     }
 
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
index a8b14bc..8e8d650 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
@@ -273,8 +273,7 @@
         values.put(Media.TITLE, "testimage");
         long dateAdded = System.currentTimeMillis() / 1000;
         values.put(Media.DATE_ADDED, dateAdded);
-        File externalFile = new File(externalPath);
-        long dateModified = externalFile.lastModified() / 1000;
+        long dateModified = System.currentTimeMillis() / 1000;
         values.put(Media.DATE_MODIFIED, dateModified);
 
         // insert
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
index b6afb70..722274d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
@@ -216,7 +216,7 @@
         }
 
         try {
-            int invalidUsage = 0x0010;
+            int invalidUsage = 0x0020;
             Allocation.createFromBitmap(mRS, B,
                 Allocation.MipmapControl.MIPMAP_NONE, invalidUsage);
             fail("should throw RSIllegalArgumentException.");
@@ -285,83 +285,103 @@
      * Test all copy from/to routines for byte/short/int/float
      */
 
-    void helperFloatCopy(int nElems) {
+    void helperFloatCopy(int nElems, int offset, int count, int copyMode) {
         Allocation A = Allocation.createSized(mRS, Element.F32(mRS), nElems);
 
         float src[], dst[];
         src = new float[nElems];
         dst = new float[nElems];
-        for (int i = 0; i < nElems; i++) {
+        for (int i = 0; i < count; i++) {
             src[i] = (float)i;
-            dst[i] = -1.0f;
+            dst[offset + i] = -1.0f;
         }
 
-        A.copyFrom(src);
+        switch (copyMode) {
+        case 0: A.copyFrom(src); break;
+        case 1: A.copyFromUnchecked(src); break;
+        case 2: A.copy1DRangeFrom(offset, count, src); break;
+        case 3: A.copy1DRangeFromUnchecked(offset, count, src); break;
+        }
         A.copyTo(dst);
 
-        for (int i = 0; i < nElems; i++) {
-            assertEquals(dst[i], src[i]);
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[i]);
         }
     }
 
-    void helperByteCopy(int nElems) {
+    void helperByteCopy(int nElems, int offset, int count, int copyMode) {
         Allocation A = Allocation.createSized(mRS, Element.I8(mRS), nElems);
 
         byte src[], dst[];
         src = new byte[nElems];
         dst = new byte[nElems];
-        for (int i = 0; i < nElems; i++) {
+        for (int i = 0; i < count; i++) {
             src[i] = (byte)i;
-            dst[i] = -1;
+            dst[offset + i] = -1;
         }
 
-        A.copyFrom(src);
+        switch (copyMode) {
+        case 0: A.copyFrom(src); break;
+        case 1: A.copyFromUnchecked(src); break;
+        case 2: A.copy1DRangeFrom(offset, count, src); break;
+        case 3: A.copy1DRangeFromUnchecked(offset, count, src); break;
+        }
         A.copyTo(dst);
 
-        for (int i = 0; i < nElems; i++) {
-            assertEquals(dst[i], src[i]);
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[i]);
         }
     }
 
-    void helperShortCopy(int nElems) {
+    void helperShortCopy(int nElems, int offset, int count, int copyMode) {
         Allocation A = Allocation.createSized(mRS, Element.I16(mRS), nElems);
 
         short src[], dst[];
         src = new short[nElems];
         dst = new short[nElems];
-        for (int i = 0; i < nElems; i++) {
+        for (int i = 0; i < count; i++) {
             src[i] = (short)i;
-            dst[i] = -1;
+            dst[offset + i] = -1;
         }
 
-        A.copyFrom(src);
+        switch (copyMode) {
+        case 0: A.copyFrom(src); break;
+        case 1: A.copyFromUnchecked(src); break;
+        case 2: A.copy1DRangeFrom(offset, count, src); break;
+        case 3: A.copy1DRangeFromUnchecked(offset, count, src); break;
+        }
         A.copyTo(dst);
 
-        for (int i = 0; i < nElems; i++) {
-            assertEquals(dst[i], src[i]);
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[i]);
         }
     }
 
-    void helperIntCopy(int nElems) {
+    void helperIntCopy(int nElems, int offset, int count, int copyMode) {
         Allocation A = Allocation.createSized(mRS, Element.I32(mRS), nElems);
 
         int src[], dst[];
         src = new int[nElems];
         dst = new int[nElems];
-        for (int i = 0; i < nElems; i++) {
+        for (int i = 0; i < count; i++) {
             src[i] = i;
-            dst[i] = -1;
+            dst[offset + i] = -1;
         }
 
-        A.copyFrom(src);
+        switch (copyMode) {
+        case 0: A.copyFrom(src); break;
+        case 1: A.copyFromUnchecked(src); break;
+        case 2: A.copy1DRangeFrom(offset, count, src); break;
+        case 3: A.copy1DRangeFromUnchecked(offset, count, src); break;
+        }
         A.copyTo(dst);
 
-        for (int i = 0; i < nElems; i++) {
-            assertEquals(dst[i], src[i]);
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[i]);
         }
     }
 
-    void helperBaseObjCopy(int nElems) {
+    void helperBaseObjCopy(int nElems, int offset, int count, int copyMode) {
         Allocation A =
             Allocation.createSized(mRS, Element.ELEMENT(mRS), nElems);
         Element E[] = new Element[nElems];
@@ -400,18 +420,270 @@
         }
     }
 
+    void helperFloatAllocationCopy(int nElems, int offset, int count) {
+
+        Allocation srcA = Allocation.createSized(mRS, Element.F32(mRS), nElems);
+        Allocation dstA = Allocation.createSized(mRS, Element.F32(mRS), nElems);
+
+        float src[], dst[];
+        src = new float[nElems];
+        dst = new float[nElems];
+        for (int i = 0; i < nElems; i++) {
+            src[i] = (float)i;
+            dst[i] = -1.0f;
+        }
+
+        // First populate the source allocation
+        srcA.copyFrom(src);
+        // Now test allocation to allocation copy
+        dstA.copy1DRangeFrom(offset, count, srcA, offset);
+        dstA.copyTo(dst);
+
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[offset + i]);
+        }
+    }
+
+    void helperByteAllocationCopy(int nElems, int offset, int count) {
+
+        Allocation srcA = Allocation.createSized(mRS, Element.I8(mRS), nElems);
+        Allocation dstA = Allocation.createSized(mRS, Element.I8(mRS), nElems);
+
+        byte src[], dst[];
+        src = new byte[nElems];
+        dst = new byte[nElems];
+        for (int i = 0; i < nElems; i++) {
+            src[i] = (byte)i;
+            dst[i] = -1;
+        }
+
+        // First populate the source allocation
+        srcA.copyFrom(src);
+        // Now test allocation to allocation copy
+        dstA.copy1DRangeFrom(offset, count, srcA, offset);
+        dstA.copyTo(dst);
+
+        for (int i = 0; i < count; i++) {
+            assertEquals(dst[offset + i], src[offset + i]);
+        }
+    }
+
+    void helperFloatCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
+        Allocation A = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        float src[], dst[];
+        src = new float[width * height];
+        dst = new float[nElemsX * nElemsY];
+        for (int i = width * height - 1; i >= 0; i--) {
+            src[i] = (float)i;
+        }
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            dst[i] = -1.0f;
+        }
+
+        A.copy2DRangeFrom(xOffset, yOffset, width, height, src);
+        A.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[sourceCount--]);
+            }
+        }
+    }
+
+    void helperByteCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.I8(mRS));
+        Allocation A = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        byte src[], dst[];
+        src = new byte[width * height];
+        dst = new byte[nElemsX * nElemsY];
+        for (int i = width * height - 1; i >= 0; i--) {
+            src[i] = (byte)i;
+        }
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            dst[i] = -1;
+        }
+
+        A.copy2DRangeFrom(xOffset, yOffset, width, height, src);
+        A.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[sourceCount--]);
+            }
+        }
+    }
+
+    void helperShortCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.I16(mRS));
+        Allocation A = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        short src[], dst[];
+        src = new short[width * height];
+        dst = new short[nElemsX * nElemsY];
+        for (int i = width * height - 1; i >= 0; i--) {
+            src[i] = (short)i;
+        }
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            dst[i] = -1;
+        }
+
+        A.copy2DRangeFrom(xOffset, yOffset, width, height, src);
+        A.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[sourceCount--]);
+            }
+        }
+    }
+
+    void helperIntCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.I32(mRS));
+        Allocation A = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        int src[], dst[];
+        src = new int[width * height];
+        dst = new int[nElemsX * nElemsY];
+        for (int i = width * height - 1; i >= 0; i--) {
+            src[i] = i;
+        }
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            dst[i] = -1;
+        }
+
+        A.copy2DRangeFrom(xOffset, yOffset, width, height, src);
+        A.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[sourceCount--]);
+            }
+        }
+    }
+
+    void helperFloatAllocationCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
+        Allocation srcA = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+        Allocation dstA = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        float src[], dst[];
+        src = new float[nElemsX * nElemsY];
+        dst = new float[nElemsX * nElemsY];
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            src[i] = (float)i;
+            dst[i] = -1.0f;
+        }
+        srcA.copyFrom(src);
+        dstA.copy2DRangeFrom(xOffset, yOffset, width, height, srcA, xOffset, yOffset);
+        dstA.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[y * nElemsX + x]);
+            }
+        }
+    }
+
+    void helperByteAllocationCopy2D(int nElemsX, int nElemsY,
+                           int xOffset, int yOffset,
+                           int width, int height) {
+        Type.Builder b = new Type.Builder(mRS, Element.I8(mRS));
+        Allocation srcA = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+        Allocation dstA = Allocation.createTyped(mRS, b.setX(nElemsX).setY(nElemsY).create());
+
+        byte src[], dst[];
+        src = new byte[nElemsX * nElemsY];
+        dst = new byte[nElemsX * nElemsY];
+        for (int i = nElemsX * nElemsY - 1; i >= 0; i--) {
+            src[i] = (byte)i;
+            dst[i] = -1;
+        }
+        srcA.copyFrom(src);
+        dstA.copy2DRangeFrom(xOffset, yOffset, width, height, srcA, xOffset, yOffset);
+        dstA.copyTo(dst);
+
+        int sourceCount = width * height - 1;
+        for (int y = yOffset + height - 1; y >= yOffset ; y--) {
+            for (int x = xOffset + width - 1; x >= xOffset ; x--) {
+                assertEquals(dst[y * nElemsX + x], src[y * nElemsX + x]);
+            }
+        }
+    }
+
     static int elemsToTest = 20;
 
-    public void testCopyOperations() {
+    public void test1DCopyOperations() {
         for (int s = 8; s <= elemsToTest; s += 2) {
-            helperFloatCopy(s);
-            helperByteCopy(s);
-            helperShortCopy(s);
-            helperIntCopy(s);
-            helperBaseObjCopy(s);
+            for (int mode = 0; mode <= 1; mode ++) {
+                helperFloatCopy(s, 0, s, mode);
+                helperByteCopy(s, 0, s, mode);
+                helperShortCopy(s, 0, s, mode);
+                helperIntCopy(s, 0, s, mode);
+                helperBaseObjCopy(s, 0, s, mode);
+            }
+
+            // now test copy range
+            for (int mode = 2; mode <= 3; mode ++) {
+                for (int off = 0; off < s; off ++) {
+                    for (int count = 1; count <= s - off; count ++) {
+                        helperFloatCopy(s, off, count, mode);
+                        helperByteCopy(s, off, count, mode);
+                        helperShortCopy(s, off, count, mode);
+                        helperIntCopy(s, off, count, mode);
+                        helperBaseObjCopy(s, off, count, mode);
+                    }
+                }
+            }
+
+            for (int off = 0; off < s; off ++) {
+                for (int count = 1; count <= s - off; count ++) {
+                    helperFloatAllocationCopy(s, off, count);
+                    helperByteAllocationCopy(s, off, count);
+                }
+            }
         }
+
         helperBitmapCopy(bDimX, bDimY);
     }
+
+    public void test2DCopyOperations() {
+        for (int sX = 8; sX <= elemsToTest; sX += 5) {
+            for (int sY = 8; sY <= elemsToTest; sY += 5) {
+                for (int offX = 0; offX < sX; offX += 3) {
+                    for (int offY = 0; offY < sY; offY += 3) {
+                        for (int w = 1; w <= sX - offX; w += 3) {
+                            for (int h = 1; h <= sY - offY; h += 3) {
+                                helperFloatCopy2D(sX, sY, offX, offY, w, h);
+                                helperByteCopy2D(sX, sY, offX, offY, w, h);
+                                helperShortCopy2D(sX, sY, offX, offY, w, h);
+                                helperIntCopy2D(sX, sY, offX, offY, w, h);
+                                helperFloatAllocationCopy2D(sX, sY, offX, offY, w, h);
+                                helperByteAllocationCopy2D(sX, sY, offX, offY, w, h);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
 
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/BaseObjTest.java b/tests/tests/renderscript/src/android/renderscript/cts/BaseObjTest.java
new file mode 100644
index 0000000..a079951
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/BaseObjTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.BaseObj;
+import android.renderscript.Font;
+import android.renderscript.Font.Style;
+import android.renderscript.RSIllegalArgumentException;
+
+public class BaseObjTest extends RSBaseGraphics {
+
+    public void testBaseObj() {
+        Style S = Font.Style.NORMAL;
+        Font F = Font.create(mRS, mRes, "sans-serif", S, 8);
+        assertTrue(F != null);
+        BaseObj B = F;
+        B.setName("sans-serif");
+        try {
+            B.setName("sans-serif");
+            fail("set name twice for a BaseObj");
+        } catch (RSIllegalArgumentException e) {
+        }
+        B.destroy();
+
+        F = Font.create(mRS, mRes, "serif", S, 8);
+        assertTrue(F != null);
+        B = F;
+        try {
+            B.setName("");
+            fail("set empty name for a BaseObj");
+        } catch (RSIllegalArgumentException e) {
+        }
+        B.setName("serif");
+        B.destroy();
+
+        F = Font.create(mRS, mRes, "mono", S, 8);
+        assertTrue(F != null);
+        B = F;
+        try {
+            B.setName(null);
+            fail("set name as null string reference for a BaseObj");
+        } catch (RSIllegalArgumentException e) {
+        }
+        B.setName("mono");
+        B.destroy();
+    }
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
index 8d24227..59c4de4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
@@ -22,6 +22,12 @@
 import android.renderscript.Byte3;
 import android.renderscript.Byte4;
 
+import android.renderscript.Double2;
+import android.renderscript.Double3;
+import android.renderscript.Double4;
+
+import android.renderscript.Element;
+
 import android.renderscript.Float2;
 import android.renderscript.Float3;
 import android.renderscript.Float4;
@@ -34,10 +40,14 @@
 import android.renderscript.Long3;
 import android.renderscript.Long4;
 
+import android.renderscript.RSRuntimeException;
+
 import android.renderscript.Short2;
 import android.renderscript.Short3;
 import android.renderscript.Short4;
 
+import android.renderscript.Type;
+
 import com.android.cts.stub.R;
 
 public class ComputeTest extends RSBaseCompute {
@@ -46,15 +56,52 @@
         Byte2 b2 = new Byte2();
         b2.x = 1;
         b2.y = 2;
+        b2 = new Byte2((byte)1, (byte)2);
+        assertTrue(b2.x == 1);
+        assertTrue(b2.y == 2);
         Byte3 b3 = new Byte3();
         b3.x = 1;
         b3.y = 2;
         b3.z = 2;
+        b3 = new Byte3((byte)1, (byte)2, (byte)3);
+        assertTrue(b3.x == 1);
+        assertTrue(b3.y == 2);
+        assertTrue(b3.z == 3);
         Byte4 b4 = new Byte4();
         b4.x = 1;
         b4.y = 2;
         b4.x = 3;
         b4.w = 4;
+        b4 = new Byte4((byte)1, (byte)2, (byte)3, (byte)4);
+        assertTrue(b4.x == 1);
+        assertTrue(b4.y == 2);
+        assertTrue(b4.z == 3);
+        assertTrue(b4.w == 4);
+
+        Double2 d2 = new Double2();
+        d2.x = 1.0;
+        d2.y = 2.0;
+        d2 = new Double2(1.0, 2.0);
+        assertTrue(d2.x == 1.0);
+        assertTrue(d2.y == 2.0);
+        Double3 d3 = new Double3();
+        d3.x = 1.0;
+        d3.y = 2.0;
+        d3.z = 3.0;
+        d3 = new Double3(1.0, 2.0, 3.0);
+        assertTrue(d3.x == 1.0);
+        assertTrue(d3.y == 2.0);
+        assertTrue(d3.z == 3.0);
+        Double4 d4 = new Double4();
+        d4.x = 1.0;
+        d4.y = 2.0;
+        d4.x = 3.0;
+        d4.w = 4.0;
+        d4 = new Double4(1.0, 2.0, 3.0, 4.0);
+        assertTrue(d4.x == 1.0);
+        assertTrue(d4.y == 2.0);
+        assertTrue(d4.z == 3.0);
+        assertTrue(d4.w == 4.0);
 
         Float2 f2 = new Float2();
         f2.x = 1.0f;
@@ -84,41 +131,77 @@
         Int2 i2 = new Int2();
         i2.x = 1;
         i2.y = 2;
+        i2 = new Int2(1, 2);
+        assertTrue(i2.x == 1);
+        assertTrue(i2.y == 2);
         Int3 i3 = new Int3();
         i3.x = 1;
         i3.y = 2;
         i3.z = 3;
+        i3 = new Int3(1, 2, 3);
+        assertTrue(i3.x == 1);
+        assertTrue(i3.y == 2);
+        assertTrue(i3.z == 3);
         Int4 i4 = new Int4();
         i4.x = 1;
         i4.y = 2;
         i4.x = 3;
         i4.w = 4;
+        i4 = new Int4(1, 2, 3, 4);
+        assertTrue(i4.x == 1);
+        assertTrue(i4.y == 2);
+        assertTrue(i4.z == 3);
+        assertTrue(i4.w == 4);
 
         Long2 l2 = new Long2();
         l2.x = 1;
         l2.y = 2;
+        l2 = new Long2(1, 2);
+        assertTrue(l2.x == 1);
+        assertTrue(l2.y == 2);
         Long3 l3 = new Long3();
         l3.x = 1;
         l3.y = 2;
         l3.z = 3;
+        l3 = new Long3(1, 2, 3);
+        assertTrue(l3.x == 1);
+        assertTrue(l3.y == 2);
+        assertTrue(l3.z == 3);
         Long4 l4 = new Long4();
         l4.x = 1;
         l4.y = 2;
         l4.x = 3;
         l4.w = 4;
+        l4 = new Long4(1, 2, 3, 4);
+        assertTrue(l4.x == 1);
+        assertTrue(l4.y == 2);
+        assertTrue(l4.z == 3);
+        assertTrue(l4.w == 4);
 
         Short2 s2 = new Short2();
         s2.x = 1;
         s2.y = 2;
+        s2 = new Short2((short)1, (short)2);
+        assertTrue(s2.x == 1);
+        assertTrue(s2.y == 2);
         Short3 s3 = new Short3();
         s3.x = 1;
         s3.y = 2;
         s3.z = 3;
+        s3 = new Short3((short)1, (short)2, (short)3);
+        assertTrue(s3.x == 1);
+        assertTrue(s3.y == 2);
+        assertTrue(s3.z == 3);
         Short4 s4 = new Short4();
         s4.x = 1;
         s4.y = 2;
         s4.x = 3;
         s4.w = 4;
+        s4 = new Short4((short)1, (short)2, (short)3, (short)4);
+        assertTrue(s4.x == 1);
+        assertTrue(s4.y == 2);
+        assertTrue(s4.z == 3);
+        assertTrue(s4.w == 4);
     }
 
     private boolean initializeGlobals(ScriptC_primitives s) {
@@ -241,4 +324,52 @@
         assertEquals(result, RS_MSG_TEST_PASSED);
     }
 
+    void setUpAllocation(Allocation a, int val) {
+        Type t = a.getType();
+        int x = t.getX();
+
+        int[] arr = new int[x];
+        for (int i = 0; i < x; i++) {
+            arr[i] = val;
+        }
+        a.copyFrom(arr);
+    }
+
+    void checkAllocation(Allocation a, int val) {
+        Type t = a.getType();
+        int x = t.getX();
+
+        int[] arr = new int[x];
+        a.copyTo(arr);
+        for (int i = 0; i < x; i++) {
+            assertTrue(arr[i] == val);
+        }
+    }
+
+    /**
+     * Test support for reflected forEach() as well as validation of parameters.
+     */
+    public void testForEach() {
+        ScriptC_negate s = new ScriptC_negate(mRS,
+                                              mRes,
+                                              R.raw.negate);
+
+        int x = 7;
+        Type t = new Type.Builder(mRS, Element.I32(mRS)).setX(x).create();
+        Allocation in = Allocation.createTyped(mRS, t);
+        Allocation out = Allocation.createTyped(mRS, t);
+
+        int val = 5;
+        setUpAllocation(in, val);
+        s.forEach_root(in, out);
+        checkAllocation(out, -val);
+
+        Type badT = new Type.Builder(mRS, Element.I32(mRS)).setX(x-1).create();
+        Allocation badOut = Allocation.createTyped(mRS, badT);
+        try {
+            s.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
index 7723c20..4f8185a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
@@ -72,15 +72,41 @@
         assertTrue(Element.F32_3(mRS) != null);
         assertTrue(Element.F32_4(mRS) != null);
         assertTrue(Element.F64(mRS) != null);
+        assertTrue(Element.F64_2(mRS) != null);
+        assertTrue(Element.F64_3(mRS) != null);
+        assertTrue(Element.F64_4(mRS) != null);
         assertTrue(Element.I8(mRS) != null);
+        assertTrue(Element.I8_2(mRS) != null);
+        assertTrue(Element.I8_3(mRS) != null);
+        assertTrue(Element.I8_4(mRS) != null);
         assertTrue(Element.I16(mRS) != null);
+        assertTrue(Element.I16_2(mRS) != null);
+        assertTrue(Element.I16_3(mRS) != null);
+        assertTrue(Element.I16_4(mRS) != null);
         assertTrue(Element.I32(mRS) != null);
+        assertTrue(Element.I32_2(mRS) != null);
+        assertTrue(Element.I32_3(mRS) != null);
+        assertTrue(Element.I32_4(mRS) != null);
         assertTrue(Element.I64(mRS) != null);
+        assertTrue(Element.I64_2(mRS) != null);
+        assertTrue(Element.I64_3(mRS) != null);
+        assertTrue(Element.I64_4(mRS) != null);
         assertTrue(Element.U8(mRS) != null);
+        assertTrue(Element.U8_2(mRS) != null);
+        assertTrue(Element.U8_3(mRS) != null);
         assertTrue(Element.U8_4(mRS) != null);
         assertTrue(Element.U16(mRS) != null);
+        assertTrue(Element.U16_2(mRS) != null);
+        assertTrue(Element.U16_3(mRS) != null);
+        assertTrue(Element.U16_4(mRS) != null);
         assertTrue(Element.U32(mRS) != null);
+        assertTrue(Element.U32_2(mRS) != null);
+        assertTrue(Element.U32_3(mRS) != null);
+        assertTrue(Element.U32_4(mRS) != null);
         assertTrue(Element.U64(mRS) != null);
+        assertTrue(Element.U64_2(mRS) != null);
+        assertTrue(Element.U64_3(mRS) != null);
+        assertTrue(Element.U64_4(mRS) != null);
         assertTrue(Element.MATRIX_2X2(mRS) != null);
         assertTrue(Element.MATRIX_3X3(mRS) != null);
         assertTrue(Element.MATRIX_4X4(mRS) != null);
@@ -98,6 +124,143 @@
         assertTrue(Element.ELEMENT(mRS) != null);
     }
 
+    public void testEquals() {
+        assertTrue(Element.A_8(mRS).equals(Element.A_8(mRS)));
+        assertFalse(Element.A_8(mRS).equals(Element.U8(mRS)));
+
+        // Compatible elements
+        assertTrue(Element.A_8(mRS).isCompatible(Element.U8(mRS)));
+        assertTrue(Element.U8(mRS).isCompatible(Element.A_8(mRS)));
+
+        // Verify equivalence of user-built Elements
+        Element.Builder eb1 = new Element.Builder(mRS);
+        eb1.add(Element.I8(mRS), "Test");
+        Element e1 = eb1.add(Element.U8(mRS), "UTest").create();
+
+        assertTrue(e1.equals(e1));
+
+        Element.Builder eb2 = new Element.Builder(mRS);
+        eb2.add(Element.I8(mRS), "Test");
+        Element e2 = eb2.add(Element.U8(mRS), "UTest").create();
+
+        assertTrue(e1.equals(e2));
+        assertTrue(e2.equals(e1));
+        assertTrue(e1.hashCode() == e2.hashCode());
+        assertTrue(e1.isCompatible(e2));
+        assertTrue(e2.isCompatible(e1));
+
+        // Check name differences
+        Element.Builder eb3 = new Element.Builder(mRS);
+        eb3.add(Element.I8(mRS), "Test");
+        Element e3 = eb3.add(Element.U8(mRS), "NotUTest").create();
+
+        assertFalse(e1.equals(e3));
+        assertFalse(e3.equals(e1));
+        assertFalse(e1.isCompatible(e3));
+        assertFalse(e3.isCompatible(e1));
+
+        eb1.add(Element.I8(mRS), "Another");
+        assertFalse(e1.equals(eb1.create()));
+        assertFalse(eb1.create().equals(e1));
+
+        // Compatible sub-elements but neither equal nor compatible
+        Element.Builder eb4 = new Element.Builder(mRS);
+        eb4.add(Element.I8(mRS), "Test");
+        Element e4 = eb4.add(Element.A_8(mRS), "UTest").create();
+
+        assertFalse(e1.equals(e4));
+        assertFalse(e4.equals(e1));
+        assertFalse(e1.isCompatible(e4));
+        assertFalse(e4.isCompatible(e1));
+
+        // Check identity from same builder
+        assertTrue(eb1.create().isCompatible(eb1.create()));
+    }
+
+    public void testIsCompatible() {
+        Element[] ALLOCATION = { Element.ALLOCATION(mRS) };
+        // A_8 is in U8
+        Element[] BOOLEAN = { Element.BOOLEAN(mRS) };
+        Element[] ELEMENT = { Element.ELEMENT(mRS) };
+        Element[] F32 = { Element.F32(mRS) };
+        Element[] F32_2 = { Element.F32_2(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_32, 2) };
+        Element[] F32_3 = { Element.F32_3(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_32, 3) };
+        Element[] F32_4 = { Element.F32_4(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_32, 4) };
+        Element[] F64 = { Element.F64(mRS) };
+        Element[] I16 = { Element.I16(mRS) };
+        Element[] I32 = { Element.I32(mRS) };
+        Element[] I64 = { Element.I64(mRS) };
+        Element[] I8 = { Element.I8(mRS) };
+        // MATRIX4X4 is in MATRIX_4X4
+        Element[] MATRIX_2X2 = { Element.MATRIX_2X2(mRS) };
+        Element[] MATRIX_3X3 = { Element.MATRIX_3X3(mRS) };
+        Element[] MATRIX_4X4 = { Element.MATRIX4X4(mRS),
+                                 Element.MATRIX_4X4(mRS) };
+        Element[] MESH = { Element.MESH(mRS) };
+        Element[] PROGRAM_FRAGMENT = { Element.PROGRAM_FRAGMENT(mRS) };
+        Element[] PROGRAM_RASTER = { Element.PROGRAM_RASTER(mRS) };
+        Element[] PROGRAM_STORE = { Element.PROGRAM_STORE(mRS) };
+        Element[] PROGRAM_VERTEX = { Element.PROGRAM_VERTEX(mRS) };
+        Element[] RGBA_4444 = { Element.RGBA_4444(mRS),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_4_4_4_4,
+                                Element.DataKind.PIXEL_RGBA) };
+        Element[] RGBA_5551 = { Element.RGBA_5551(mRS),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_5_5_5_1,
+                                Element.DataKind.PIXEL_RGBA) };
+        // RGBA_8888 is in U8_4
+        Element[] RGB_565 = { Element.RGB_565(mRS),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_5_6_5,
+                                Element.DataKind.PIXEL_RGB) };
+        // RGB_888 is in U8_3
+        Element[] SAMPLER = { Element.SAMPLER(mRS) };
+        Element[] SCRIPT = { Element.SCRIPT(mRS) };
+        Element[] TYPE = { Element.TYPE(mRS) };
+        Element[] U16 = { Element.U16(mRS) };
+        Element[] U32 = { Element.U32(mRS) };
+        Element[] U64 = { Element.U64(mRS) };
+        Element[] U8 = { Element.A_8(mRS),
+                         Element.U8(mRS),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
+                                Element.DataKind.PIXEL_A) };
+        Element[] U8_3 = { Element.RGB_888(mRS),
+            Element.createVector(mRS, Element.DataType.UNSIGNED_8, 3),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
+                                Element.DataKind.PIXEL_RGB) };
+        Element[] U8_4 = { Element.U8_4(mRS),
+                           Element.RGBA_8888(mRS),
+            Element.createVector(mRS, Element.DataType.UNSIGNED_8, 4),
+            Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
+                                Element.DataKind.PIXEL_RGBA) };
+
+        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
+                                    F32_3, F32_4, F64, I16, I32, I64, I8,
+                                    MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, MESH,
+                                    PROGRAM_FRAGMENT, PROGRAM_RASTER,
+                                    PROGRAM_STORE, PROGRAM_VERTEX, RGBA_4444,
+                                    RGBA_5551, RGB_565, SAMPLER, SCRIPT, TYPE,
+                                    U16, U32, U64, U8, U8_3, U8_4 };
+
+        int ElementArrsLen = ElementArrs.length;
+        for (int i = 0; i < ElementArrsLen; i++) {
+            for (int j = 0; j < ElementArrsLen; j++) {
+                for (Element el : ElementArrs[i]) {
+                    for (Element er : ElementArrs[j]) {
+                        if (i == j) {
+                            // Elements within a group are compatible
+                            assertTrue(el.isCompatible(er));
+                        } else {
+                            // Elements from different groups are incompatible
+                            assertFalse(el.isCompatible(er));
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     public void testElementBuilder() {
         for (int arraySize = 1; arraySize <= 3; arraySize++) {
             // Now test array size
@@ -113,15 +276,41 @@
             eb.add(Element.F32_3(mRS), "F32_3", arraySize);
             eb.add(Element.F32_4(mRS), "F32_4", arraySize);
             eb.add(Element.F64(mRS), "F64", arraySize);
+            eb.add(Element.F64_2(mRS), "F64_2", arraySize);
+            eb.add(Element.F64_3(mRS), "F64_3", arraySize);
+            eb.add(Element.F64_4(mRS), "F64_4", arraySize);
             eb.add(Element.I8(mRS), "I8", arraySize);
+            eb.add(Element.I8_2(mRS), "I8_2", arraySize);
+            eb.add(Element.I8_3(mRS), "I8_3", arraySize);
+            eb.add(Element.I8_4(mRS), "I8_4", arraySize);
             eb.add(Element.I16(mRS), "I16", arraySize);
+            eb.add(Element.I16_2(mRS), "I16_2", arraySize);
+            eb.add(Element.I16_3(mRS), "I16_3", arraySize);
+            eb.add(Element.I16_4(mRS), "I16_4", arraySize);
             eb.add(Element.I32(mRS), "I32", arraySize);
+            eb.add(Element.I32_2(mRS), "I32_2", arraySize);
+            eb.add(Element.I32_3(mRS), "I32_3", arraySize);
+            eb.add(Element.I32_4(mRS), "I32_4", arraySize);
             eb.add(Element.I64(mRS), "I64", arraySize);
+            eb.add(Element.I64_2(mRS), "I64_2", arraySize);
+            eb.add(Element.I64_3(mRS), "I64_3", arraySize);
+            eb.add(Element.I64_4(mRS), "I64_4", arraySize);
             eb.add(Element.U8(mRS), "U8", arraySize);
+            eb.add(Element.U8_2(mRS), "U8_2", arraySize);
+            eb.add(Element.U8_3(mRS), "U8_3", arraySize);
             eb.add(Element.U8_4(mRS), "U8_4", arraySize);
             eb.add(Element.U16(mRS), "U16", arraySize);
+            eb.add(Element.U16_2(mRS), "U16_2", arraySize);
+            eb.add(Element.U16_3(mRS), "U16_3", arraySize);
+            eb.add(Element.U16_4(mRS), "U16_4", arraySize);
             eb.add(Element.U32(mRS), "U32", arraySize);
+            eb.add(Element.U32_2(mRS), "U32_2", arraySize);
+            eb.add(Element.U32_3(mRS), "U32_3", arraySize);
+            eb.add(Element.U32_4(mRS), "U32_4", arraySize);
             eb.add(Element.U64(mRS), "U64", arraySize);
+            eb.add(Element.U64_2(mRS), "U64_2", arraySize);
+            eb.add(Element.U64_3(mRS), "U64_3", arraySize);
+            eb.add(Element.U64_4(mRS), "U64_4", arraySize);
             eb.add(Element.MATRIX_2X2(mRS), "MATRIX_2X2", arraySize);
             eb.add(Element.MATRIX_3X3(mRS), "MATRIX_3X3", arraySize);
             eb.add(Element.MATRIX_4X4(mRS), "MATRIX_4X4", arraySize);
@@ -153,15 +342,41 @@
         assertFalse(Element.F32_3(mRS).isComplex());
         assertFalse(Element.F32_4(mRS).isComplex());
         assertFalse(Element.F64(mRS).isComplex());
+        assertFalse(Element.F64_2(mRS).isComplex());
+        assertFalse(Element.F64_3(mRS).isComplex());
+        assertFalse(Element.F64_4(mRS).isComplex());
         assertFalse(Element.I8(mRS).isComplex());
+        assertFalse(Element.I8_2(mRS).isComplex());
+        assertFalse(Element.I8_3(mRS).isComplex());
+        assertFalse(Element.I8_4(mRS).isComplex());
         assertFalse(Element.I16(mRS).isComplex());
+        assertFalse(Element.I16_2(mRS).isComplex());
+        assertFalse(Element.I16_3(mRS).isComplex());
+        assertFalse(Element.I16_4(mRS).isComplex());
         assertFalse(Element.I32(mRS).isComplex());
+        assertFalse(Element.I32_2(mRS).isComplex());
+        assertFalse(Element.I32_3(mRS).isComplex());
+        assertFalse(Element.I32_4(mRS).isComplex());
         assertFalse(Element.I64(mRS).isComplex());
+        assertFalse(Element.I64_2(mRS).isComplex());
+        assertFalse(Element.I64_3(mRS).isComplex());
+        assertFalse(Element.I64_4(mRS).isComplex());
         assertFalse(Element.U8(mRS).isComplex());
+        assertFalse(Element.U8_2(mRS).isComplex());
+        assertFalse(Element.U8_3(mRS).isComplex());
         assertFalse(Element.U8_4(mRS).isComplex());
         assertFalse(Element.U16(mRS).isComplex());
+        assertFalse(Element.U16_2(mRS).isComplex());
+        assertFalse(Element.U16_3(mRS).isComplex());
+        assertFalse(Element.U16_4(mRS).isComplex());
         assertFalse(Element.U32(mRS).isComplex());
+        assertFalse(Element.U32_2(mRS).isComplex());
+        assertFalse(Element.U32_3(mRS).isComplex());
+        assertFalse(Element.U32_4(mRS).isComplex());
         assertFalse(Element.U64(mRS).isComplex());
+        assertFalse(Element.U64_2(mRS).isComplex());
+        assertFalse(Element.U64_3(mRS).isComplex());
+        assertFalse(Element.U64_4(mRS).isComplex());
         assertFalse(Element.MATRIX_2X2(mRS).isComplex());
         assertFalse(Element.MATRIX_3X3(mRS).isComplex());
         assertFalse(Element.MATRIX_4X4(mRS).isComplex());
@@ -244,8 +459,9 @@
         assertEquals(DataKind.PIXEL_LA, DataKind.valueOf("PIXEL_LA"));
         assertEquals(DataKind.PIXEL_RGB, DataKind.valueOf("PIXEL_RGB"));
         assertEquals(DataKind.PIXEL_RGBA, DataKind.valueOf("PIXEL_RGBA"));
+        assertEquals(DataKind.PIXEL_DEPTH, DataKind.valueOf("PIXEL_DEPTH"));
         // Make sure no new enums are added
-        assertEquals(6, DataKind.values().length);
+        assertEquals(7, DataKind.values().length);
 
         for (DataKind dk : DataKind.values()) {
             if (dk != DataKind.USER) {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FieldPackerTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FieldPackerTest.java
index f986d4b..8625b9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FieldPackerTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FieldPackerTest.java
@@ -20,6 +20,9 @@
 import android.renderscript.Byte3;
 import android.renderscript.Byte4;
 import android.renderscript.FieldPacker;
+import android.renderscript.Double2;
+import android.renderscript.Double3;
+import android.renderscript.Double4;
 import android.renderscript.Float2;
 import android.renderscript.Float3;
 import android.renderscript.Float4;
@@ -32,6 +35,7 @@
 import android.renderscript.Matrix2f;
 import android.renderscript.Matrix3f;
 import android.renderscript.Matrix4f;
+import android.renderscript.RSIllegalArgumentException;
 import android.renderscript.Short2;
 import android.renderscript.Short3;
 import android.renderscript.Short4;
@@ -46,6 +50,9 @@
         fp.addF32(new Float4());
         fp.addF32(new Float2());
         fp.addF64(0.2);
+        fp.addF64(new Double2());
+        fp.addF64(new Double3());
+        fp.addF64(new Double4());
         fp.addI16(new Short3());
         fp.addI16(new Short2());
         fp.addI16((short)-2);
@@ -55,6 +62,9 @@
         fp.addI32(new Int4());
         fp.addI32(new Int2());
         fp.addI64(-8);
+        fp.addI64(new Long2());
+        fp.addI64(new Long3());
+        fp.addI64(new Long4());
         fp.addI8((byte)-1);
         fp.addI8(new Byte4());
         fp.addI8(new Byte2());
@@ -72,21 +82,89 @@
         fp.addU32(new Long3());
         fp.addU32(4);
         fp.addU64(8);
+        fp.addU64(new Long2());
+        fp.addU64(new Long3());
+        fp.addU64(new Long4());
         fp.addU8(new Short2());
         fp.addU8(new Short4());
         fp.addU8((byte)1);
         fp.addU8(new Short3());
     }
 
-    public void testAlign() {
-        /*
-        fp.align(int v);
-        final byte[]     getData();
-        fp.reset(int i);
-        fp.reset();
-        fp.skip(int i);
-        */
+    public void testAlignResetSkip() {
+        for (int alignAmount = 1; alignAmount < 16; alignAmount <<= 1) {
+            FieldPacker fp = new FieldPacker(256);
+            for (int i = 0; i < 32; i++) {
+                fp.align(alignAmount);
+                fp.addI8((byte)i);
+            }
+
+            byte[] b = fp.getData();
+            for (int i = 0; i < 32; i++) {
+                assertEquals(i, b[alignAmount * i]);
+            }
+
+            // Check that align is zeroing out bytes in between
+            fp.reset();
+            fp.addI8((byte)0);
+            fp.align(256);
+            b = fp.getData();
+            for (int i = 0; i < 256; i++) {
+                assertEquals(0, b[i]);
+            }
+        }
+
+        for (int skipAmount = 1; skipAmount < 4; skipAmount++) {
+            FieldPacker fp = new FieldPacker(256);
+            for (int i = 0; i < 32; i++) {
+                fp.addI8((byte)i);
+                fp.skip(skipAmount);
+            }
+            fp.reset(1);
+            for (int i = 0; i < 32; i++) {
+                fp.addI8((byte)i);
+                fp.skip(skipAmount);
+            }
+
+            byte[] b = fp.getData();
+            for (int i = 0; i < 32; i++) {
+                // Check that skip is not altering any other bytes
+                assertEquals(i, b[i * (skipAmount + 1)]);
+                assertEquals(i, b[(i * (skipAmount + 1)) + 1]);
+            }
+        }
+
+        // Error cases
+        FieldPacker fp = new FieldPacker(256);
+
+        int[] badAlignArgs = {-4, -3, -2, -1, 0, 3, 5, 127};
+        for (int arg: badAlignArgs) {
+            try {
+                fp.align(arg);
+                fail("should throw RSIllegalArgumentException.");
+            } catch (RSIllegalArgumentException e) {
+            }
+        }
+
+        int[] badResetArgs = {-1000, -2, -1, 256, 257, 1000};
+        for (int arg: badResetArgs) {
+            try {
+                fp.reset(arg);
+                fail("should throw RSIllegalArgumentException.");
+            } catch (RSIllegalArgumentException e) {
+            }
+        }
+
+        // Skip allows us to move 1 past the final element in the FieldPacker
+        int[] badSkipArgs = {-1000, -6, -5, 253, 1000};
+        for (int arg: badSkipArgs) {
+            try {
+                fp.reset(4);
+                fp.skip(arg);
+                fail("should throw RSIllegalArgumentException.");
+            } catch (RSIllegalArgumentException e) {
+            }
+        }
     }
 }
 
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
new file mode 100644
index 0000000..12c8fb0
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.Allocation;
+
+import android.renderscript.Byte2;
+import android.renderscript.Byte3;
+import android.renderscript.Byte4;
+
+import android.renderscript.Double2;
+import android.renderscript.Double3;
+import android.renderscript.Double4;
+
+import android.renderscript.Element;
+
+import android.renderscript.Float2;
+import android.renderscript.Float3;
+import android.renderscript.Float4;
+
+import android.renderscript.Int2;
+import android.renderscript.Int3;
+import android.renderscript.Int4;
+
+import android.renderscript.Long2;
+import android.renderscript.Long3;
+import android.renderscript.Long4;
+
+import android.renderscript.RSRuntimeException;
+
+import android.renderscript.Short2;
+import android.renderscript.Short3;
+import android.renderscript.Short4;
+
+import android.renderscript.Type;
+
+import com.android.cts.stub.R;
+
+public class ForEachTest extends RSBaseCompute {
+    /**
+     * Test support for reflected forEach() as well as validation of parameters.
+     */
+    public void testForEach() {
+        int x = 7;
+
+        // badOut is always I8, so it is always an invalid type
+        Type t = new Type.Builder(mRS, Element.I8(mRS)).setX(x).create();
+        Allocation badOut = Allocation.createTyped(mRS, t);
+
+        // I8
+        ScriptC_fe_i8 fe_i8 = new ScriptC_fe_i8(mRS, mRes, R.raw.fe_i8);
+        Allocation in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U8(mRS)).setX(x).create();
+        Allocation out = Allocation.createTyped(mRS, t);
+        fe_i8.forEach_root(in, out);
+        try {
+            fe_i8.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I8_2
+        ScriptC_fe_i8_2 fe_i8_2 = new ScriptC_fe_i8_2(mRS,
+                                                      mRes,
+                                                      R.raw.fe_i8_2);
+        t = new Type.Builder(mRS, Element.I8_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U8_2(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8_2.forEach_root(in, out);
+        try {
+            fe_i8_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I8_3
+        ScriptC_fe_i8_3 fe_i8_3 = new ScriptC_fe_i8_3(mRS,
+                                                      mRes,
+                                                      R.raw.fe_i8_3);
+        t = new Type.Builder(mRS, Element.I8_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U8_3(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8_3.forEach_root(in, out);
+        try {
+            fe_i8_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I8_4
+        ScriptC_fe_i8_4 fe_i8_4 = new ScriptC_fe_i8_4(mRS,
+                                                      mRes,
+                                                      R.raw.fe_i8_4);
+        t = new Type.Builder(mRS, Element.I8_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U8_4(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8_4.forEach_root(in, out);
+        try {
+            fe_i8_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I16
+        ScriptC_fe_i16 fe_i16 = new ScriptC_fe_i16(mRS, mRes, R.raw.fe_i16);
+        t = new Type.Builder(mRS, Element.I16(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U16(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i16.forEach_root(in, out);
+        try {
+            fe_i16.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I16_2
+        ScriptC_fe_i16_2 fe_i16_2 = new ScriptC_fe_i16_2(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i16_2);
+        t = new Type.Builder(mRS, Element.I16_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U16_2(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i16_2.forEach_root(in, out);
+        try {
+            fe_i16_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I16_3
+        ScriptC_fe_i16_3 fe_i16_3 = new ScriptC_fe_i16_3(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i16_3);
+        t = new Type.Builder(mRS, Element.I16_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U16_3(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i16_3.forEach_root(in, out);
+        try {
+            fe_i16_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I16_4
+        ScriptC_fe_i16_4 fe_i16_4 = new ScriptC_fe_i16_4(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i16_4);
+        t = new Type.Builder(mRS, Element.I16_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U16_4(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i16_4.forEach_root(in, out);
+        try {
+            fe_i16_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I32
+        ScriptC_fe_i32 fe_i32 = new ScriptC_fe_i32(mRS, mRes, R.raw.fe_i32);
+        t = new Type.Builder(mRS, Element.I32(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U32(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i32.forEach_root(in, out);
+        try {
+            fe_i32.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I32_2
+        ScriptC_fe_i32_2 fe_i32_2 = new ScriptC_fe_i32_2(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i32_2);
+        t = new Type.Builder(mRS, Element.I32_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U32_2(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i32_2.forEach_root(in, out);
+        try {
+            fe_i32_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I32_3
+        ScriptC_fe_i32_3 fe_i32_3 = new ScriptC_fe_i32_3(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i32_3);
+        t = new Type.Builder(mRS, Element.I32_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U32_3(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i32_3.forEach_root(in, out);
+        try {
+            fe_i32_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I32_4
+        ScriptC_fe_i32_4 fe_i32_4 = new ScriptC_fe_i32_4(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i32_4);
+        t = new Type.Builder(mRS, Element.I32_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U32_4(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i32_4.forEach_root(in, out);
+        try {
+            fe_i32_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I64
+        ScriptC_fe_i64 fe_i64 = new ScriptC_fe_i64(mRS, mRes, R.raw.fe_i64);
+        t = new Type.Builder(mRS, Element.I64(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U64(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i64.forEach_root(in, out);
+        try {
+            fe_i64.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I64_2
+        ScriptC_fe_i64_2 fe_i64_2 = new ScriptC_fe_i64_2(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i64_2);
+        t = new Type.Builder(mRS, Element.I64_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U64_2(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i64_2.forEach_root(in, out);
+        try {
+            fe_i64_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I64_3
+        ScriptC_fe_i64_3 fe_i64_3 = new ScriptC_fe_i64_3(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i64_3);
+        t = new Type.Builder(mRS, Element.I64_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U64_3(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i64_3.forEach_root(in, out);
+        try {
+            fe_i64_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // I64_4
+        ScriptC_fe_i64_4 fe_i64_4 = new ScriptC_fe_i64_4(mRS,
+                                                         mRes,
+                                                         R.raw.fe_i64_4);
+        t = new Type.Builder(mRS, Element.I64_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.U64_4(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i64_4.forEach_root(in, out);
+        try {
+            fe_i64_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F32
+        ScriptC_fe_f32 fe_f32 = new ScriptC_fe_f32(mRS, mRes, R.raw.fe_f32);
+        t = new Type.Builder(mRS, Element.F32(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f32.forEach_root(in, out);
+        try {
+            fe_f32.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F32_2
+        ScriptC_fe_f32_2 fe_f32_2 = new ScriptC_fe_f32_2(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f32_2);
+        t = new Type.Builder(mRS, Element.F32_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.F32_2(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_f32_2.forEach_root(in, out);
+        try {
+            fe_f32_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F32_3
+        ScriptC_fe_f32_3 fe_f32_3 = new ScriptC_fe_f32_3(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f32_3);
+        t = new Type.Builder(mRS, Element.F32_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f32_3.forEach_root(in, out);
+        try {
+            fe_f32_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F32_4
+        ScriptC_fe_f32_4 fe_f32_4 = new ScriptC_fe_f32_4(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f32_4);
+        t = new Type.Builder(mRS, Element.F32_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f32_4.forEach_root(in, out);
+        try {
+            fe_f32_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F64
+        ScriptC_fe_f64 fe_f64 = new ScriptC_fe_f64(mRS, mRes, R.raw.fe_f64);
+        t = new Type.Builder(mRS, Element.F64(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f64.forEach_root(in, out);
+        try {
+            fe_f64.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F64_2
+        ScriptC_fe_f64_2 fe_f64_2 = new ScriptC_fe_f64_2(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f64_2);
+        t = new Type.Builder(mRS, Element.F64_2(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f64_2.forEach_root(in, out);
+        try {
+            fe_f64_2.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F64_3
+        ScriptC_fe_f64_3 fe_f64_3 = new ScriptC_fe_f64_3(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f64_3);
+        t = new Type.Builder(mRS, Element.F64_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f64_3.forEach_root(in, out);
+        try {
+            fe_f64_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // F64_4
+        ScriptC_fe_f64_4 fe_f64_4 = new ScriptC_fe_f64_4(mRS,
+                                                         mRes,
+                                                         R.raw.fe_f64_4);
+        t = new Type.Builder(mRS, Element.F64_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_f64_4.forEach_root(in, out);
+        try {
+            fe_f64_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // fe_test (struct)
+        ScriptC_fe_struct fe_struct = new ScriptC_fe_struct(mRS,
+                                                            mRes,
+                                                            R.raw.fe_struct);
+        in = new ScriptField_fe_test(mRS, x).getAllocation();
+        out = new ScriptField_fe_test(mRS, x).getAllocation();
+        fe_struct.forEach_root(in, out);
+        try {
+            fe_struct.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // BOOLEAN
+        ScriptC_fe_bool fe_bool = new ScriptC_fe_bool(mRS, mRes, R.raw.fe_bool);
+        t = new Type.Builder(mRS, Element.BOOLEAN(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        out = Allocation.createTyped(mRS, t);
+        fe_bool.forEach_root(in, out);
+        try {
+            fe_bool.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // A_8
+        t = new Type.Builder(mRS, Element.I8(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.A_8(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8.forEach_root(in, out);
+        try {
+            fe_i8.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // RGBA_8888
+        t = new Type.Builder(mRS, Element.I8_4(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.RGBA_8888(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8_4.forEach_root(in, out);
+        try {
+            fe_i8_4.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+
+        // RGB_888
+        t = new Type.Builder(mRS, Element.I8_3(mRS)).setX(x).create();
+        in = Allocation.createTyped(mRS, t);
+        t = new Type.Builder(mRS, Element.RGB_888(mRS)).setX(x).create();
+        out = Allocation.createTyped(mRS, t);
+        fe_i8_3.forEach_root(in, out);
+        try {
+            fe_i8_3.forEach_root(in, badOut);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ProgramFragmentTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ProgramFragmentTest.java
index d6a7f0d..9a71386 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ProgramFragmentTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ProgramFragmentTest.java
@@ -131,7 +131,7 @@
 
         String simpleUni = "void main() {\n"+
                            "  vec4 col = vec4(0.1, 0.2, 0.3, 0.4);\n"+
-                           "  col = UNI_MVP * col;\n"+
+                           "  col = UNI_MATRIX * col;\n"+
                            "  gl_FragColor = col;\n"+
                            "}";
 
@@ -139,13 +139,13 @@
                               "  vec4 col = vec4(0.1, 0.2, 0.3, 0.4);"+
                               "  col += texture2D(UNI_Tex0, vec2(0.1, 0.1));\n"+
                               "  col += textureCube(UNI_Tex1, vec3(0.1, 0.2, 0.3));\n"+
-                              "  col = UNI_MVP * col;\n"+
+                              "  col = UNI_MATRIX * col;\n"+
                               "  gl_FragColor = col;\n"+
                               "}";
 
         String multiUni = "void main() {\n"+
                           "  vec4 col = vec4(0.1, 0.2, 0.3, 0.4);"+
-                          "  col = UNI_MVP * col;\n"+
+                          "  col = UNI_MATRIX * col;\n"+
                           "  col = UNI_EXTRA * col;\n"+
                           "  col += UNI_extra4;\n"+
                           "  col.xyz += UNI_extra3;\n "+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java
index 0a5c60e..3c2c188 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java
@@ -143,11 +143,11 @@
                             "}";
 
         String simpleAttrSimpleUni = "void main() {\n"+
-                                     "  gl_Position = UNI_MVP * ATTRIB_position;\n"+
+                                     "  gl_Position = UNI_MATRIX * ATTRIB_position;\n"+
                                      "}";
 
         String multiAttrMultiUni = "void main() {\n"+
-                                   "  vec4 temp = UNI_MVP * ATTRIB_position;\n"+
+                                   "  vec4 temp = UNI_MATRIX * ATTRIB_position;\n"+
                                    "  temp = UNI_EXTRA * temp;\n"+
                                    "  temp.xyz += ATTRIB_normal;\n"+
                                    "  temp.xy += ATTRIB_texture0;\n"+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptCTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptCTest.java
new file mode 100644
index 0000000..7f4ba93
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptCTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.renderscript.cts;
+
+import android.content.res.Resources;
+
+import android.renderscript.RenderScript;
+import android.renderscript.ScriptC;
+
+import com.android.cts.stub.R;
+
+public class ScriptCTest extends RSBaseCompute {
+
+    class ScriptCHelper extends ScriptC {
+        public ScriptCHelper(int id, RenderScript rs) {
+            super(id, rs);
+        }
+
+        public ScriptCHelper(RenderScript rs,
+                             Resources resources,
+                             int resourceID) {
+            super(rs, resources, resourceID);
+        }
+    }
+
+    public void testScriptC() {
+        // Test basic constructor
+        ScriptCHelper h = new ScriptCHelper(0, mRS);
+
+        // Test actual constructor
+        h = new ScriptCHelper(mRS, mRes, R.raw.negate);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
new file mode 100644
index 0000000..90b847a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.renderscript.cts;
+
+import android.content.res.Resources;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.FieldPacker;
+import android.renderscript.RenderScript;
+import android.renderscript.Script;
+import android.renderscript.ScriptC;
+import android.renderscript.Type;
+
+import android.renderscript.cts.ScriptC_negate;
+
+import com.android.cts.stub.R;
+
+public class ScriptTest extends RSBaseCompute {
+
+    public void testScript() {
+        Script S = new ScriptC_primitives(mRS, mRes, R.raw.primitives);
+
+        S.setTimeZone("America/New_York");
+
+        S.setVar(4, 9.0f);  // floatTest
+        S.setVar(5, 9.0);  // doubleTest
+        S.setVar(6, 7);  // charTest
+        S.setVar(7, 300);  // shortTest
+        S.setVar(8, 20000);  // intTest
+        S.setVar(9, 20000000000l);  // longTest
+        S.setVar(11, true);  // boolTest
+
+        FieldPacker fp = new FieldPacker(4);
+        fp.addI32(3);
+        S.setVar(12, fp);  // structTest
+
+        Type.Builder tb = new Type.Builder(mRS, Element.I32(mRS));
+        Allocation a = Allocation.createTyped(mRS, tb.create());
+        S.setVar(13, a);  // allocationTest
+
+        S.bindAllocation(a, 14);  // intPtrTest
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
index 928abaf..13d4977 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
@@ -169,11 +169,31 @@
         assertEquals(Type.CubemapFace.NEGATIVE_X, Type.CubemapFace.valueOf("NEGATIVE_X"));
         assertEquals(Type.CubemapFace.NEGATIVE_Y, Type.CubemapFace.valueOf("NEGATIVE_Y"));
         assertEquals(Type.CubemapFace.NEGATIVE_Z, Type.CubemapFace.valueOf("NEGATIVE_Z"));
+        assertEquals(Type.CubemapFace.POSITIVE_X, Type.CubemapFace.valueOf("POSITIVE_X"));
+        assertEquals(Type.CubemapFace.POSITIVE_Y, Type.CubemapFace.valueOf("POSITIVE_Y"));
+        assertEquals(Type.CubemapFace.POSITIVE_Z, Type.CubemapFace.valueOf("POSITIVE_Z"));
+        // Legacy typo enums
         assertEquals(Type.CubemapFace.POSITVE_X, Type.CubemapFace.valueOf("POSITVE_X"));
         assertEquals(Type.CubemapFace.POSITVE_Y, Type.CubemapFace.valueOf("POSITVE_Y"));
         assertEquals(Type.CubemapFace.POSITVE_Z, Type.CubemapFace.valueOf("POSITVE_Z"));
         // Make sure no new enums are added
-        assertEquals(6, Type.CubemapFace.values().length);
+        assertEquals(9, Type.CubemapFace.values().length);
+    }
+
+    public void testEquals() {
+        Type.Builder b1 = new Type.Builder(mRS, Element.F32(mRS));
+        Type t1 = b1.setX(5).setY(5).create();
+
+        Type.Builder b2 = new Type.Builder(mRS, Element.F32(mRS));
+        Type t2 = b2.setX(5).setY(5).create();
+
+        assertTrue(t1.equals(t2));
+        assertTrue(t2.equals(t1));
+        assertTrue(t1.hashCode() == t2.hashCode());
+
+        t2 = b2.setX(4).create();
+        assertFalse(t1.equals(t2));
+        assertFalse(t2.equals(t1));
     }
 }
 
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index a15b2ec..932c564 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -29,5 +29,7 @@
 
 LOCAL_SDK_VERSION := current
 
+LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+
 include $(BUILD_PACKAGE)
 
diff --git a/tests/tests/speech/AndroidManifest.xml b/tests/tests/speech/AndroidManifest.xml
index 6e1e528..778f763 100755
--- a/tests/tests/speech/AndroidManifest.xml
+++ b/tests/tests/speech/AndroidManifest.xml
@@ -24,9 +24,8 @@
 
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
-    <!--  self-instrumenting test package. -->
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-                     android:targetPackage="com.android.cts.speech"
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="com.android.cts.stub"
                      android:label="CTS tests of android.speech"/>
 
 </manifest>
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
new file mode 100644
index 0000000..c19f6c0
--- /dev/null
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+package android.speech.tts.cts;
+
+import android.os.Environment;
+import android.speech.tts.TextToSpeech;
+import android.test.AndroidTestCase;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.HashMap;
+
+/**
+ * Tests for {@link android.speech.tts.TextToSpeechService} using StubTextToSpeechService.
+ */
+public class TextToSpeechServiceTest extends AndroidTestCase {
+
+    private static final String UTTERANCE_ID = "utterance";
+    private static final String UTTERANCE = "text to speech cts test";
+    private static final String SAMPLE_FILE_NAME = "mytts.wav";
+
+    private TextToSpeechWrapper mTts;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTts = TextToSpeechWrapper.createTextToSpeechMockWrapper(getContext());
+        assertNotNull(mTts);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mTts.shutdown();
+    }
+
+    private TextToSpeech getTts() {
+        return mTts.getTts();
+    }
+
+    public void testSynthesizeToFile() throws Exception {
+        File sampleFile = new File(Environment.getExternalStorageDirectory(), SAMPLE_FILE_NAME);
+        try {
+            assertFalse(sampleFile.exists());
+
+            int result = getTts().synthesizeToFile(UTTERANCE, createParams(), sampleFile.getPath());
+            assertEquals("synthesizeToFile() failed", TextToSpeech.SUCCESS, result);
+
+            assertTrue("synthesizeToFile() completion timeout", mTts.waitForComplete(UTTERANCE_ID));
+            assertTrue("synthesizeToFile() didn't produce a file", sampleFile.exists());
+            assertTrue("synthesizeToFile() produced a non-sound file",
+                    TextToSpeechWrapper.isSoundFile(sampleFile.getPath()));
+        } finally {
+            sampleFile.delete();
+        }
+    }
+
+    public void testSpeak() throws Exception {
+        int result = getTts().speak(UTTERANCE, TextToSpeech.QUEUE_FLUSH, createParams());
+        assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        assertTrue("speak() completion timeout", waitForUtterance());
+    }
+
+    public void testMediaPlayerFails() throws Exception {
+        File sampleFile = new File(Environment.getExternalStorageDirectory(), "notsound.wav");
+        try {
+            assertFalse(TextToSpeechWrapper.isSoundFile(sampleFile.getPath()));
+            FileOutputStream out = new FileOutputStream(sampleFile);
+            out.write(new byte[] { 0x01, 0x02 });
+            out.close();
+            assertFalse(TextToSpeechWrapper.isSoundFile(sampleFile.getPath()));
+        } finally {
+            sampleFile.delete();
+        }
+    }
+
+    private HashMap<String, String> createParams() {
+        HashMap<String, String> params = new HashMap<String,String>();
+        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
+        return params;
+    }
+
+    private boolean waitForUtterance() throws InterruptedException {
+        return mTts.waitForComplete(UTTERANCE_ID);
+    }
+
+}
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
index e012fe3..799fd8d 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
@@ -15,98 +15,31 @@
  */
 package android.speech.tts.cts;
 
-import dalvik.annotation.TestTargetClass;
-
-import android.media.MediaPlayer;
 import android.os.Environment;
 import android.speech.tts.TextToSpeech;
-import android.speech.tts.TextToSpeech.OnInitListener;
-import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
 import android.test.AndroidTestCase;
-import android.util.Log;
 
 import java.io.File;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 
 /**
  * Tests for {@link android.speech.tts.TextToSpeech}
  */
-@TestTargetClass(TextToSpeech.class)
 public class TextToSpeechTest extends AndroidTestCase {
 
-    private TextToSpeech mTts;
-
-    private static final String UTTERANCE = "utterance";
+    private static final String UTTERANCE_ID = "utterance";
     private static final String SAMPLE_TEXT = "This is a sample text to speech string";
     private static final String SAMPLE_FILE_NAME = "mytts.wav";
-    /** maximum time to wait for tts to be initialized */
-    private static final int TTS_INIT_MAX_WAIT_TIME = 30 * 1000;
-    /** maximum time to wait for speech call to be complete */
-    private static final int TTS_SPEECH_MAX_WAIT_TIME = 5 * 1000;
-    private static final String LOG_TAG = "TextToSpeechTest";
 
-    /**
-     * Listener for waiting for TTS engine initialization completion.
-     */
-    private static class InitWaitListener implements OnInitListener {
-        private int mStatus = TextToSpeech.ERROR;
-
-        public void onInit(int status) {
-            mStatus = status;
-            synchronized(this) {
-                notify();
-            }
-        }
-
-        public boolean waitForInit() throws InterruptedException {
-            if (mStatus == TextToSpeech.SUCCESS) {
-                return true;
-            }
-            synchronized (this) {
-                wait(TTS_INIT_MAX_WAIT_TIME);
-            }
-            return mStatus == TextToSpeech.SUCCESS;
-        }
-    }
-
-    /**
-     * Listener for waiting for utterance completion.
-     */
-    private static class UtteranceWaitListener implements OnUtteranceCompletedListener {
-        private boolean mIsComplete = false;
-        private final String mExpectedUtterance;
-
-        public UtteranceWaitListener(String expectedUtteranceId) {
-            mExpectedUtterance = expectedUtteranceId;
-        }
-
-        public void onUtteranceCompleted(String utteranceId) {
-            if (mExpectedUtterance.equals(utteranceId)) {
-                synchronized(this) {
-                    mIsComplete = true;
-                    notify();
-                }
-            }
-        }
-
-        public boolean waitForComplete() throws InterruptedException {
-            if (mIsComplete) {
-                return true;
-            }
-            synchronized (this) {
-                wait(TTS_SPEECH_MAX_WAIT_TIME);
-                return mIsComplete;
-            }
-        }
-    }
+    private TextToSpeechWrapper mTts;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        InitWaitListener listener = new InitWaitListener();
-        mTts = new TextToSpeech(getContext(), listener);
-        assertTrue(listener.waitForInit());
+        mTts = TextToSpeechWrapper.createTextToSpeechWrapper(getContext());
+        assertNotNull(mTts);
         assertTrue(checkAndSetLanguageAvailable());
     }
 
@@ -116,76 +49,92 @@
         mTts.shutdown();
     }
 
+    private TextToSpeech getTts() {
+        return mTts.getTts();
+    }
+
     /**
      * Ensures at least one language is available for tts
      */
-    private boolean  checkAndSetLanguageAvailable() {
+    private boolean checkAndSetLanguageAvailable() {
         // checks if at least one language is available in Tts
+        final Locale defaultLocale = Locale.getDefault();
+        // If the language for the default locale is available, then
+        // use that.
+        int defaultAvailability = getTts().isLanguageAvailable(defaultLocale);
+
+        if (defaultAvailability == TextToSpeech.LANG_AVAILABLE ||
+            defaultAvailability == TextToSpeech.LANG_COUNTRY_AVAILABLE ||
+            defaultAvailability == TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE) {
+            getTts().setLanguage(defaultLocale);
+            return true;
+        }
+
         for (Locale locale : Locale.getAvailableLocales()) {
-            int availability = mTts.isLanguageAvailable(locale);
+            int availability = getTts().isLanguageAvailable(locale);
             if (availability == TextToSpeech.LANG_AVAILABLE ||
                 availability == TextToSpeech.LANG_COUNTRY_AVAILABLE ||
                 availability == TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE) {
-                mTts.setLanguage(locale);
+                getTts().setLanguage(locale);
                 return true;
             }
         }
         return false;
     }
 
-    /**
-     * Tests that {@link TextToSpeech#synthesizeToFile(String, java.util.HashMap, String)} produces
-     * a non-zero sized file.
-     * @throws InterruptedException
-     */
     public void testSynthesizeToFile() throws Exception {
         File sampleFile = new File(Environment.getExternalStorageDirectory(), SAMPLE_FILE_NAME);
         try {
             assertFalse(sampleFile.exists());
-            // use an utterance listener to determine when synthesizing is complete
-            HashMap<String, String> param = new HashMap<String,String>();
-            param.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE);
-            UtteranceWaitListener listener = new UtteranceWaitListener(UTTERANCE);
-            mTts.setOnUtteranceCompletedListener(listener);
 
-            int result = mTts.synthesizeToFile(SAMPLE_TEXT, param, sampleFile.getPath());
-            assertEquals(TextToSpeech.SUCCESS, result);
+            int result = getTts().synthesizeToFile(SAMPLE_TEXT, createParams(),
+                    sampleFile.getPath());
+            assertEquals("synthesizeToFile() failed", TextToSpeech.SUCCESS, result);
 
-            assertTrue(listener.waitForComplete());
-            assertTrue(sampleFile.exists());
-            assertTrue(isMusicFile(sampleFile.getPath()));
-
+            assertTrue("synthesizeToFile() completion timeout", waitForUtterance());
+            assertTrue("synthesizeToFile() didn't produce a file", sampleFile.exists());
+            assertTrue("synthesizeToFile() produced a non-sound file",
+                    TextToSpeechWrapper.isSoundFile(sampleFile.getPath()));
         } finally {
-            deleteFile(sampleFile);
+            sampleFile.delete();
         }
     }
 
-    /**
-     * Determine if given file path is a valid, playable music file.
-     */
-    private boolean isMusicFile(String filePath) {
-        // use media player to play the file. If it succeeds with no exceptions, assume file is
-        //valid
-        try {
-            MediaPlayer mp = new MediaPlayer();
-            mp.setDataSource(filePath);
-            mp.prepare();
-            mp.start();
-            mp.stop();
-            return true;
-        } catch (Exception e) {
-            Log.e(LOG_TAG, "Exception while attempting to play music file", e);
-            return false;
-        }
+    public void testSpeak() throws Exception {
+        int result = getTts().speak(SAMPLE_TEXT, TextToSpeech.QUEUE_FLUSH, createParams());
+        assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        assertTrue("speak() completion timeout", waitForUtterance());
     }
 
-    /**
-     * Deletes the file at given path
-     * @param sampleFilePath
-     */
-    private void deleteFile(File file) {
-        if (file != null && file.exists()) {
-            file.delete();
-        }
+    public void testGetEnginesIncludesDefault() throws Exception {
+        List<TextToSpeech.EngineInfo> engines = getTts().getEngines();
+        assertNotNull("getEngines() returned null", engines);
+        assertContainsEngine(getTts().getDefaultEngine(), engines);
     }
+
+    public void testGetEnginesIncludesMock() throws Exception {
+        List<TextToSpeech.EngineInfo> engines = getTts().getEngines();
+        assertNotNull("getEngines() returned null", engines);
+        assertContainsEngine(TextToSpeechWrapper.MOCK_TTS_ENGINE, engines);
+    }
+
+    private void assertContainsEngine(String engine, List<TextToSpeech.EngineInfo> engines) {
+        for (TextToSpeech.EngineInfo engineInfo : engines) {
+            if (engineInfo.name.equals(engine)) {
+                return;
+            }
+        }
+        fail("Engine " + engine + " not found");
+    }
+
+    private HashMap<String, String> createParams() {
+        HashMap<String, String> params = new HashMap<String,String>();
+        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
+        return params;
+    }
+
+    private boolean waitForUtterance() throws InterruptedException {
+        return mTts.waitForComplete(UTTERANCE_ID);
+    }
+
 }
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
new file mode 100644
index 0000000..cba242f
--- /dev/null
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2009 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.
+ */
+package android.speech.tts.cts;
+
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TextToSpeech.OnInitListener;
+import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
+import android.util.Log;
+
+import java.util.HashSet;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Wrapper for {@link TextToSpeech} with some handy test functionality.
+ */
+public class TextToSpeechWrapper {
+    private static final String LOG_TAG = "TextToSpeechServiceTest";
+
+    public static final String MOCK_TTS_ENGINE = "com.android.cts.stub";
+
+    private final Context mContext;
+    private TextToSpeech mTts;
+    private final InitWaitListener mInitListener;
+    private final UtteranceWaitListener mUtteranceListener;
+
+    /** maximum time to wait for tts to be initialized */
+    private static final int TTS_INIT_MAX_WAIT_TIME = 30 * 1000;
+    /** maximum time to wait for speech call to be complete */
+    private static final int TTS_SPEECH_MAX_WAIT_TIME = 5 * 1000;
+
+    private TextToSpeechWrapper(Context context) {
+        mContext = context;
+        mInitListener = new InitWaitListener();
+        mUtteranceListener = new UtteranceWaitListener();
+    }
+
+    private boolean initTts() throws InterruptedException {
+        return initTts(new TextToSpeech(mContext, mInitListener));
+    }
+
+    private boolean initTts(String engine) throws InterruptedException {
+        return initTts(new TextToSpeech(mContext, mInitListener, engine));
+    }
+
+    private boolean initTts(TextToSpeech tts) throws InterruptedException {
+        mTts = tts;
+        if (!mInitListener.waitForInit()) {
+            return false;
+        }
+        mTts.setOnUtteranceCompletedListener(mUtteranceListener);
+        return true;
+    }
+
+    public boolean waitForComplete(String utteranceId) throws InterruptedException {
+        return mUtteranceListener.waitForComplete(utteranceId);
+    }
+
+    public TextToSpeech getTts() {
+        return mTts;
+    }
+
+    public void shutdown() {
+        mTts.shutdown();
+    }
+
+    public static TextToSpeechWrapper createTextToSpeechWrapper(Context context)
+            throws InterruptedException {
+        TextToSpeechWrapper wrapper = new TextToSpeechWrapper(context);
+        if (wrapper.initTts()) {
+            return wrapper;
+        } else {
+            return null;
+        }
+    }
+
+    public static TextToSpeechWrapper createTextToSpeechMockWrapper(Context context)
+            throws InterruptedException {
+        TextToSpeechWrapper wrapper = new TextToSpeechWrapper(context);
+        if (wrapper.initTts(MOCK_TTS_ENGINE)) {
+            return wrapper;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Listener for waiting for TTS engine initialization completion.
+     */
+    private static class InitWaitListener implements OnInitListener {
+        private final Lock mLock = new ReentrantLock();
+        private final Condition mDone  = mLock.newCondition();
+        private Integer mStatus = null;
+
+        public void onInit(int status) {
+            mLock.lock();
+            try {
+                mStatus = new Integer(status);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        public boolean waitForInit() throws InterruptedException {
+            long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
+            mLock.lock();
+            try {
+                while (mStatus == null) {
+                    if (timeOutNanos <= 0) {
+                        return false;
+                    }
+                    timeOutNanos = mDone.awaitNanos(timeOutNanos);
+                }
+                return mStatus == TextToSpeech.SUCCESS;
+            } finally {
+                mLock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Listener for waiting for utterance completion.
+     */
+    private static class UtteranceWaitListener implements OnUtteranceCompletedListener {
+        private final Lock mLock = new ReentrantLock();
+        private final Condition mDone  = mLock.newCondition();
+        private final HashSet<String> mCompletedUtterances = new HashSet<String>();
+
+        public void onUtteranceCompleted(String utteranceId) {
+            mLock.lock();
+            try {
+                mCompletedUtterances.add(utteranceId);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        public boolean waitForComplete(String utteranceId)
+                throws InterruptedException {
+            long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
+            mLock.lock();
+            try {
+                while (!mCompletedUtterances.remove(utteranceId)) {
+                    if (timeOutNanos <= 0) {
+                        return false;
+                    }
+                    timeOutNanos = mDone.awaitNanos(timeOutNanos);
+                }
+                return true;
+            } finally {
+                mLock.unlock();
+            }
+        }
+    }
+
+    /**
+     * Determines if given file path is a valid, playable music file.
+     */
+    public static boolean isSoundFile(String filePath) {
+        // use media player to play the file. If it succeeds with no exceptions, assume file is
+        //valid
+        MediaPlayer mp = null;
+        try {
+            mp = new MediaPlayer();
+            mp.setDataSource(filePath);
+            mp.prepare();
+            mp.start();
+            mp.stop();
+            return true;
+        } catch (Exception e) {
+            Log.e(LOG_TAG, "Exception while attempting to play music file", e);
+            return false;
+        } finally {
+            if (mp != null) {
+                mp.release();
+            }
+        }
+    }
+
+}
diff --git a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
index f24117e..5d92a18 100644
--- a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
@@ -178,7 +178,7 @@
 
     @TestTargetNew(level = TestLevel.ADDITIONAL)
     public void test2038() {
-        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+        Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+00:00"));
 
         calendar.setTimeInMillis(((long) Integer.MIN_VALUE + Integer.MIN_VALUE) * 1000L);
         assertEquals("Sun Nov 24 17:31:44 GMT+00:00 1833",
diff --git a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
index a92f323..ba2bcdd 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -70,7 +70,6 @@
         mArrowKeyMovementMethod = new ArrowKeyMovementMethod();
 
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
 
         getInstrumentation().runOnMainSync(new Runnable() {
             public void run() {
@@ -197,8 +196,6 @@
             + "document about the behaviour of this method.")
     public void testOnTakeFoucusWithNullLayout() {
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
-
         assertSelectEndOfContent();
     }
 
@@ -214,7 +211,6 @@
             + "Spannable, int)} when the params view or text is null")
     public void testOnTakeFocusWithNullParameters() {
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
         try {
             mArrowKeyMovementMethod.onTakeFocus(null, mEditable, View.FOCUS_DOWN);
             fail("The method did not throw NullPointerException when param textView is null.");
@@ -580,8 +576,6 @@
             + "Spannable, int, KeyEvent)} when the view does not get layout")
     public void testOnKeyDownWithNullLayout() {
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
-
         try {
             mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable, KeyEvent.KEYCODE_DPAD_RIGHT,
                     null);
@@ -698,7 +692,6 @@
             + "Spannable, MotionEvent)} when the view does not get layout")
     public void testOnTouchEventWithNullLayout() {
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
         mTextView.setFocusable(true);
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -738,7 +731,6 @@
             + "Spannable, MotionEvent)} when the params view, buffer or event is null")
     public void testOnTouchEventWithNullParameters() {
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
         try {
             mArrowKeyMovementMethod.onTouchEvent(null, mEditable,
                     MotionEvent.obtain(0, 0, 0, 1, 1, 0));
@@ -812,7 +804,6 @@
                 MotionEvent.obtain(0, 0, 0, 1, 1, 0)));
 
         initTextViewWithNullLayout();
-        mEditable = (Editable) mTextView.getText();
 
         assertFalse(mArrowKeyMovementMethod.onTrackballEvent(mTextView, mEditable,
                 MotionEvent.obtain(0, 0, 0, 1, 1, 0)));
@@ -846,10 +837,411 @@
         assertFalse(method.onKeyUp(view, spannable, KeyEvent.KEYCODE_0, null));
     }
 
+    private static final String TEXT_WORDS =
+            "Lorem ipsum; dolor sit \u00e4met, conse\u0ca0_\u0ca0ctetur?       Adipiscing"
+            + ".elit.integ\u00e9r. Etiam    tristique\ntortor nec   ?:?    \n\n"
+            + "lectus porta consequ\u00e4t...  LOReM iPSuM";
+
+    @UiThreadTest
+    public void testFollowingWordStartToEnd() {
+
+        // NOTE: there seems to be much variation in how word boundaries are
+        // navigated; the behaviors asserted here were derived from Google
+        // Chrome 10.0.648.133 beta.
+
+        initTextViewWithNullLayout(TEXT_WORDS);
+
+        // |Lorem ipsum; dolor sit $met,
+        Selection.setSelection(mEditable, 0);
+        assertSelection(0);
+
+        // Lorem| ipsum; dolor sit $met,
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(5);
+
+        // Lorem ipsum|; dolor sit $met,
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(11);
+
+        // Lorem ipsum; dolor| sit $met,
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(18);
+
+        // Lorem ipsum; dolor sit| $met,
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(22);
+
+        // $met|, conse$_$ctetur$       Adipiscing.elit.integ$r.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(27);
+
+        // $met, conse$_$ctetur|$       Adipiscing.elit.integ$r.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(43);
+
+        // TODO: enable these two additional word breaks when implemented
+//        // $met, conse$_$ctetur$       Adipiscing|.elit.integ$r.
+//        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+//        assertSelection(61);
+//
+//        // $met, conse$_$ctetur$       Adipiscing.elit|.integ$r.
+//        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+//        assertSelection(66);
+
+        // $met, conse$_$ctetur$       Adipiscing.elit.integ$r|.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(74);
+
+        // integ$r. Etiam|    tristique$tortor nec   ?:?    $$lectus porta
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(81);
+
+        // integ$r. Etiam    tristique|$tortor nec   ?:?    $$lectus porta
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(94);
+
+        // integ$r. Etiam    tristique$tortor| nec   ?:?    $$lectus porta
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(101);
+
+        // integ$r. Etiam    tristique$tortor nec|   ?:?    $$lectus porta
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(105);
+
+        // integ$r. Etiam    tristique$tortor nec   ?:?    $$lectus| porta
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(123);
+
+        // $$lectus porta| consequ$t...  LOReM iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(129);
+
+        // $$lectus porta consequ$t|...  LOReM iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(139);
+
+        // $$lectus porta consequ$t...  LOReM| iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(149);
+
+        // $$lectus porta consequ$t...  LOReM iPSuM|
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(155);
+
+        // keep trying to push beyond end, which should fail
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(155);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(155);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(155);
+
+    }
+
+    @UiThreadTest
+    public void testPrecedingWordEndToStart() {
+
+        // NOTE: there seems to be much variation in how word boundaries are
+        // navigated; the behaviors asserted here were derived from Google
+        // Chrome 10.0.648.133 beta.
+
+        initTextViewWithNullLayout(TEXT_WORDS);
+
+        // $$lectus porta consequ$t...  LOReM iPSuM|
+        Selection.setSelection(mEditable, mEditable.length());
+        assertSelection(155);
+
+        // $$lectus porta consequ$t...  LOReM |iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(150);
+
+        // $$lectus porta consequ$t...  |LOReM iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(144);
+
+        // $$lectus porta |consequ$t...  LOReM iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(130);
+
+        // $$lectus |porta consequ$t...  LOReM iPSuM
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(124);
+
+        // integ$r. Etiam    tristique$tortor nec   ?:?    $$|lectus
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(117);
+
+        // integ$r. Etiam    tristique$tortor |nec   ?:?    $$lectus
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(102);
+
+        // integ$r. Etiam    tristique$|tortor nec   ?:?    $$lectus
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(95);
+
+        // integ$r. Etiam    |tristique$tortor nec   ?:?    $$lectus
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(85);
+
+        // integ$r. |Etiam    tristique$tortor nec   ?:?    $$lectus
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(76);
+
+        // TODO: enable these two additional word breaks when implemented
+//        // dolor sit $met, conse$_$ctetur$       Adipiscing.elit.|integ$r.
+//        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+//        assertSelection(67);
+//
+//        // dolor sit $met, conse$_$ctetur$       Adipiscing.|elit.integ$r.
+//        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+//        assertSelection(62);
+
+        // dolor sit $met, conse$_$ctetur$       |Adipiscing.elit.integ$r.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(51);
+
+        // dolor sit $met, |conse$_$ctetur$       Adipiscing.elit.integ$r.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(29);
+
+        // dolor sit |$met, conse$_$ctetur$       Adipiscing.elit.integ$r.
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(23);
+
+        // Lorem ipsum; dolor |sit $met
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(19);
+
+        // Lorem ipsum; |dolor sit $met
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(13);
+
+        // Lorem |ipsum; dolor sit $met
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(6);
+
+        // |Lorem ipsum; dolor sit $met
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+
+        // keep trying to push before beginning, which should fail
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+
+    }
+
+    private static final String TEXT_WORDS_WITH_NUMBERS =
+            "Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4";
+
+    @UiThreadTest
+    public void testFollowingWordStartToEndWithNumbers() {
+
+        initTextViewWithNullLayout(TEXT_WORDS_WITH_NUMBERS);
+
+        // |Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4
+        Selection.setSelection(mEditable, 0);
+        assertSelection(0);
+
+        // Lorem| ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(5);
+
+        // Lorem ipsum123,456.90|   dolor sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(21);
+
+        // Lorem ipsum123,456.90   dolor| sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(29);
+
+        // Lorem ipsum123,456.90   dolor sit|.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(33);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4|-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(37);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0|=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(41);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0=2| ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(43);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4|
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(55);
+
+        // keep trying to push beyond end, which should fail
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(55);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(55);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(55);
+
+    }
+
+    @UiThreadTest
+    public void testFollowingWordEndToStartWithNumbers() {
+
+        initTextViewWithNullLayout(TEXT_WORDS_WITH_NUMBERS);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4|
+        Selection.setSelection(mEditable, mEditable.length());
+        assertSelection(55);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 |ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(44);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-0.0=|2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(42);
+
+        // Lorem ipsum123,456.90   dolor sit.. 4-|0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(38);
+
+        // Lorem ipsum123,456.90   dolor sit.. |4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(36);
+
+        // Lorem ipsum123,456.90   dolor |sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(30);
+
+        // Lorem ipsum123,456.90   |dolor sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(24);
+
+        // Lorem |ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(6);
+
+        // |Lorem ipsum123,456.90   dolor sit.. 4-0.0=2 ADipiscing4
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+
+        // keep trying to push before beginning, which should fail
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+
+    }
+
+    private static final String TEXT_WORDS_WITH_1CHAR_FINAL_WORD = "abc d";
+
+    @UiThreadTest
+    public void testFollowingWordStartToEndWithOneCharFinalWord() {
+
+        initTextViewWithNullLayout(TEXT_WORDS_WITH_1CHAR_FINAL_WORD);
+
+        // |abc d
+        Selection.setSelection(mEditable, 0);
+        assertSelection(0);
+
+        // abc| d
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(3);
+
+        // abc d|
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+        assertSelection(mEditable.length());
+
+    }
+
+    @UiThreadTest
+    public void testFollowingWordEndToStartWithOneCharFinalWord() {
+
+        initTextViewWithNullLayout(TEXT_WORDS_WITH_1CHAR_FINAL_WORD);
+
+        // abc d|
+        Selection.setSelection(mEditable, mEditable.length());
+        assertSelection(5);
+
+        // abc |d
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(4);
+
+        // |abc d
+        assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+        assertSelection(0);
+
+    }
+
+    @UiThreadTest
+    public void testMovementFromMiddleOfWord() {
+
+        initTextViewWithNullLayout("before word after");
+        checkMoveFromInsideWord(7, 10);
+
+        // Surrogate characters: bairkan should be considered as a standard letter
+        final String BAIRKAN = "\uD800\uDF31";
+
+        initTextViewWithNullLayout("before wo" + BAIRKAN + "rd after");
+        checkMoveFromInsideWord(7, 12);
+
+        initTextViewWithNullLayout("before " + BAIRKAN + BAIRKAN + "xx after");
+        checkMoveFromInsideWord(7, 12);
+
+        initTextViewWithNullLayout("before xx" + BAIRKAN + BAIRKAN + " after");
+        checkMoveFromInsideWord(7, 12);
+
+        initTextViewWithNullLayout("before x" + BAIRKAN + "x" + BAIRKAN + " after");
+        checkMoveFromInsideWord(7, 12);
+
+        initTextViewWithNullLayout("before " + BAIRKAN + "x" + BAIRKAN + "x after");
+        checkMoveFromInsideWord(7, 12);
+
+        initTextViewWithNullLayout("before " + BAIRKAN + BAIRKAN + BAIRKAN + " after");
+        checkMoveFromInsideWord(7, 12);
+    }
+
+    private void checkMoveFromInsideWord(int wordStart, int wordEnd) {
+
+        CharSequence text = mTextView.getText();
+
+        // Check following always goes at the end of the word
+        for (int offset = wordStart; offset != wordEnd + 1; offset++) {
+            // Skip positions located between a pair of surrogate characters
+            if (Character.isSurrogatePair(text.charAt(offset - 1), text.charAt(offset))) {
+                continue;
+            }
+            Selection.setSelection(mEditable, offset);
+            assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_RIGHT));
+            assertSelection(wordEnd + 1);
+        }
+
+        // Check preceding always goes at the beginning of the word
+        for (int offset = wordEnd + 1; offset != wordStart; offset--) {
+            if (Character.isSurrogatePair(text.charAt(offset - 1), text.charAt(offset))) {
+                continue;
+            }
+            Selection.setSelection(mEditable, offset);
+            assertTrue(pressCtrlChord(KeyEvent.KEYCODE_DPAD_LEFT));
+            assertSelection(wordStart);
+        }
+    }
+
     private void initTextViewWithNullLayout() {
+        initTextViewWithNullLayout(THREE_LINES_TEXT);
+    }
+
+    private void initTextViewWithNullLayout(CharSequence text) {
         mTextView = new TextView(getActivity());
-        mTextView.setText(THREE_LINES_TEXT, BufferType.EDITABLE);
+        mTextView.setText(text, BufferType.EDITABLE);
         assertNull(mTextView.getLayout());
+        mEditable = (Editable) mTextView.getText();
     }
 
     private void pressMetaKey(int metakey, int expectedState) {
@@ -873,13 +1265,38 @@
         pressMetaKey(KeyEvent.KEYCODE_ALT_LEFT, MetaKeyKeyListener.META_ALT_ON);
     }
 
-    private void assertSelection(int position) {
-        assertSelection(position, position);
+    private boolean pressCtrlChord(int keyCode) {
+        final long now = System.currentTimeMillis();
+        final KeyEvent keyEvent = new KeyEvent(
+                now, now, KeyEvent.ACTION_DOWN, keyCode, 0, KeyEvent.META_CTRL_LEFT_ON);
+        return mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable, keyCode, keyEvent);
     }
 
-    private void assertSelection(int start, int end) {
-        assertEquals(start, Selection.getSelectionStart(mEditable));
-        assertEquals(end, Selection.getSelectionEnd(mEditable));
+    private void assertSelection(int expectedPosition) {
+        assertSelection(expectedPosition, expectedPosition);
+    }
+
+    private void assertSelection(int expectedStart, int expectedEnd) {
+        final int actualStart = Selection.getSelectionStart(mEditable);
+        final int actualEnd = Selection.getSelectionEnd(mEditable);
+
+        assertCharSequenceIndexEquals(mEditable, expectedStart, actualStart);
+        assertCharSequenceIndexEquals(mEditable, expectedEnd, actualEnd);
+    }
+
+    private static void assertCharSequenceIndexEquals(CharSequence text, int expected, int actual) {
+        final String message = "expected <" + getCursorSnippet(text, expected) + "> but was <"
+                + getCursorSnippet(text, actual) + ">";
+        assertEquals(message, expected, actual);
+    }
+
+    private static String getCursorSnippet(CharSequence text, int index) {
+        if (index >= 0 && index < text.length()) {
+            return text.subSequence(Math.max(0, index - 5), index) + "|"
+                    + text.subSequence(index, Math.min(text.length() - 1, index + 5));
+        } else {
+            return null;
+        }
     }
 
     private void assertSelectEndOfContent() {
diff --git a/tests/tests/text/src/android/text/method/cts/WordIteratorTest.java b/tests/tests/text/src/android/text/method/cts/WordIteratorTest.java
new file mode 100644
index 0000000..2b1f461
--- /dev/null
+++ b/tests/tests/text/src/android/text/method/cts/WordIteratorTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.text.method.cts;
+
+import android.text.method.WordIterator;
+
+import java.text.BreakIterator;
+
+import junit.framework.TestCase;
+
+public class WordIteratorTest extends TestCase {
+
+    WordIterator wi = new WordIterator();
+
+    private void checkIsWordWithSurrogate(int beginning, int end, int surrogateIndex) {
+        for (int i = beginning; i <= end; i++) {
+            if (i == surrogateIndex) continue;
+            assertEquals(beginning, wi.getBeginning(i));
+            assertEquals(end, wi.getEnd(i));
+        }
+    }
+
+    private void checkIsWord(int beginning, int end) {
+        checkIsWordWithSurrogate(beginning, end, -1);
+    }
+
+    private void checkIsNotWord(int beginning, int end) {
+        for (int i = beginning; i <= end; i++) {
+            assertEquals(BreakIterator.DONE, wi.getBeginning(i));
+            assertEquals(BreakIterator.DONE, wi.getEnd(i));
+        }
+    }
+
+    public void testEmptyString() {
+        wi.setCharSequence("");
+        assertEquals(BreakIterator.DONE, wi.following(0));
+        assertEquals(BreakIterator.DONE, wi.preceding(0));
+
+        assertEquals(BreakIterator.DONE, wi.getBeginning(0));
+        assertEquals(BreakIterator.DONE, wi.getEnd(0));
+    }
+
+    public void testOneWord() {
+        wi.setCharSequence("I");
+        checkIsWord(0, 1);
+
+        wi.setCharSequence("am");
+        checkIsWord(0, 2);
+
+        wi.setCharSequence("zen");
+        checkIsWord(0, 3);
+    }
+
+    public void testSpacesOnly() {
+        wi.setCharSequence(" ");
+        checkIsNotWord(0, 1);
+
+        wi.setCharSequence(", ");
+        checkIsNotWord(0, 2);
+
+        wi.setCharSequence(":-)");
+        checkIsNotWord(0, 3);
+    }
+
+    public void testBeginningEnd() {
+        wi.setCharSequence("Well hello,   there! ");
+        //                  0123456789012345678901
+        checkIsWord(0, 4);
+        checkIsWord(5, 10);
+        checkIsNotWord(11, 13);
+        checkIsWord(14, 19);
+        checkIsNotWord(20, 21);
+
+        wi.setCharSequence("  Another - sentence");
+        //                  012345678901234567890
+        checkIsNotWord(0, 1);
+        checkIsWord(2, 9);
+        checkIsNotWord(10, 11);
+        checkIsWord(12, 20);
+
+        wi.setCharSequence("This is \u0644\u0627 tested"); // Lama-aleph
+        //                  012345678     9     01234567
+        checkIsWord(0, 4);
+        checkIsWord(5, 7);
+        checkIsWord(8, 10);
+        checkIsWord(11, 17);
+    }
+
+    public void testSurrogate() {
+        final String BAIRKAN = "\uD800\uDF31";
+
+        wi.setCharSequence("one we" + BAIRKAN + "ird word");
+        //                  012345    67         890123456
+
+        checkIsWord(0, 3);
+        // Skip index 7 (there is no point in starting between the two surrogate characters)
+        checkIsWordWithSurrogate(4, 11, 7);
+        checkIsWord(12, 16);
+
+        wi.setCharSequence("one " + BAIRKAN + "xxx word");
+        //                  0123    45         678901234
+
+        checkIsWord(0, 3);
+        checkIsWordWithSurrogate(4, 9, 5);
+        checkIsWord(10, 14);
+
+        wi.setCharSequence("one xxx" + BAIRKAN + " word");
+        //                  0123456    78         901234
+
+        checkIsWord(0, 3);
+        checkIsWordWithSurrogate(4, 9, 8);
+        checkIsWord(10, 14);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/AccessibilityEventTest.java b/tests/tests/view/src/android/view/cts/AccessibilityEventTest.java
index f7c1e7a..f19b542 100644
--- a/tests/tests/view/src/android/view/cts/AccessibilityEventTest.java
+++ b/tests/tests/view/src/android/view/cts/AccessibilityEventTest.java
@@ -20,6 +20,7 @@
 import android.os.Parcel;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityRecord;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -34,10 +35,10 @@
 public class AccessibilityEventTest extends TestCase {
 
     /** The number of properties of the {@link AccessibilityEvent} class. */
-    private static final int NON_STATIC_FIELD_COUNT = 16;
+    private static final int NON_STATIC_FIELD_COUNT = 19;
 
     @MediumTest
-    public void testMarshalling() throws Exception {
+    public void testMarshaling() throws Exception {
         // no new fields, so we are testing marshaling of all such
         assertNoNewNonStaticFieldsAdded();
 
@@ -90,13 +91,17 @@
     private void assertNoNewNonStaticFieldsAdded() {
         int nonStaticFieldCount = 0;
 
-        for (Field field : AccessibilityEvent.class.getDeclaredFields()) {
-            if ((field.getModifiers() & Modifier.STATIC) == 0) {
-                nonStaticFieldCount++;
+        Class<?> clazz = AccessibilityEvent.class;
+        while (clazz != null) {
+            for (Field field : clazz.getDeclaredFields()) {
+                if ((field.getModifiers() & Modifier.STATIC) == 0) {
+                    nonStaticFieldCount++;
+                }
             }
+            clazz = clazz.getSuperclass();
         }
 
-        String message = "New fields have been added, so add code to test marchalling them.";
+        String message = "New fields have been added, so add code to test marshaling them.";
         assertEquals(message, NON_STATIC_FIELD_COUNT, nonStaticFieldCount);
     }
 
@@ -123,6 +128,23 @@
         sentEvent.setPassword(true);
         sentEvent.setRemovedCount(1);
         sentEvent.getText().add("Foo");
+
+        AccessibilityRecord record = AccessibilityRecord.obtain();
+        record.setAddedCount(1);
+        record.setBeforeText("BeforeText");
+        record.setChecked(true);
+        record.setClassName("foo.bar.baz.Class");
+        record.setContentDescription("ContentDescription");
+        record.setCurrentItemIndex(1);
+        record.setEnabled(true);
+        record.setFromIndex(1);
+        record.setFullScreen(true);
+        record.setItemCount(1);
+        record.setParcelableData(Message.obtain(null, 1, 2, 3));
+        record.setPassword(true);
+        record.setRemovedCount(1);
+        record.getText().add("Foo");
+        sentEvent.appendRecord(record);
     }
 
     /**
@@ -158,7 +180,38 @@
                 .isPassword());
         assertEquals("removedCount has incorrect value", expectedEvent.getRemovedCount(),
                 receivedEvent.getRemovedCount());
-        assertEqualsText(expectedEvent, receivedEvent);
+        assertEqualsText(expectedEvent.getText(), receivedEvent.getText());
+        assertEquals("must have one record", expectedEvent.getRecordCount(),
+                receivedEvent.getRecordCount());
+
+        AccessibilityRecord expectedRecord = expectedEvent.getRecord(0);
+        AccessibilityRecord receivedRecord = receivedEvent.getRecord(0);
+
+        assertEquals("addedCount has incorrect value", expectedRecord.getAddedCount(),
+                receivedRecord.getAddedCount());
+        assertEquals("beforeText has incorrect value", expectedRecord.getBeforeText(),
+                receivedRecord.getBeforeText());
+        assertEquals("checked has incorrect value", expectedRecord.isChecked(),
+                receivedRecord.isChecked());
+        assertEquals("className has incorrect value", expectedRecord.getClassName(),
+                receivedRecord.getClassName());
+        assertEquals("contentDescription has incorrect value",
+                expectedRecord.getContentDescription(), receivedRecord.getContentDescription());
+        assertEquals("currentItemIndex has incorrect value", expectedRecord.getCurrentItemIndex(),
+                receivedRecord.getCurrentItemIndex());
+        assertEquals("enabled has incorrect value", expectedRecord.isEnabled(),
+                receivedRecord.isEnabled());
+        assertEquals("fromIndex has incorrect value", expectedRecord.getFromIndex(),
+                receivedRecord.getFromIndex());
+        assertEquals("fullScreen has incorrect value", expectedRecord.isFullScreen(),
+                receivedRecord.isFullScreen());
+        assertEquals("itemCount has incorrect value", expectedRecord.getItemCount(),
+                receivedRecord.getItemCount());
+        assertEquals("password has incorrect value", expectedRecord.isPassword(),
+                receivedRecord.isPassword());
+        assertEquals("removedCount has incorrect value", expectedRecord.getRemovedCount(),
+                receivedRecord.getRemovedCount());
+        assertEqualsText(expectedRecord.getText(), receivedRecord.getText());
     }
 
     /**
@@ -166,11 +219,9 @@
      * <code>receivedEvent</code> by comparing the string representation of the
      * corresponding {@link CharSequence}s.
      */
-    public static void assertEqualsText(AccessibilityEvent expectedEvent,
-            AccessibilityEvent receivedEvent) {
+    public static void assertEqualsText(List<CharSequence> expectedText,
+            List<CharSequence> receivedText ) {
         String message = "text has incorrect value";
-        List<CharSequence> expectedText = expectedEvent.getText();
-        List<CharSequence> receivedText = receivedEvent.getText();
 
         TestCase.assertEquals(message, expectedText.size(), receivedText.size());
 
diff --git a/tests/tests/view/src/android/view/cts/GravityTest.java b/tests/tests/view/src/android/view/cts/GravityTest.java
index aee209e..1b5d06d 100644
--- a/tests/tests/view/src/android/view/cts/GravityTest.java
+++ b/tests/tests/view/src/android/view/cts/GravityTest.java
@@ -16,6 +16,7 @@
 
 package android.view.cts;
 
+import android.view.View;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
@@ -51,6 +52,11 @@
         new Gravity();
     }
 
+    private void applyGravity(int gravity, int w, int h, Rect container, Rect outRect, boolean bRtl) {
+        final int layoutDirection = bRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR;
+        Gravity.apply(gravity, w, h, mInRect, mOutRect, layoutDirection);
+    }
+
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
@@ -79,6 +85,16 @@
         assertEquals(26, mOutRect.right);
         assertEquals(25, mOutRect.top);
         assertEquals(28, mOutRect.bottom);
+        applyGravity(Gravity.TOP, 2, 3, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(20, mOutRect.top);
+        assertEquals(23, mOutRect.bottom);
+        applyGravity(Gravity.TOP, 2, 3, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(20, mOutRect.top);
+        assertEquals(23, mOutRect.bottom);
 
         Gravity.apply(Gravity.BOTTOM, 2, 3, mInRect, mOutRect);
         assertEquals(19, mOutRect.left);
@@ -90,6 +106,16 @@
         assertEquals(26, mOutRect.right);
         assertEquals(32, mOutRect.top);
         assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.BOTTOM, 2, 3, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(37, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.BOTTOM, 2, 3, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(37, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
 
         Gravity.apply(Gravity.LEFT, 2, 10, mInRect, mOutRect);
         assertEquals(10, mOutRect.left);
@@ -101,6 +127,37 @@
         assertEquals(17, mOutRect.right);
         assertEquals(30, mOutRect.top);
         assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.LEFT, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(12, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.LEFT, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(12, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+
+        Gravity.apply(Gravity.START, 2, 10, mInRect, mOutRect);
+        assertEquals(10, mOutRect.left);
+        assertEquals(12, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        Gravity.apply(Gravity.START, 2, 10, mInRect, 5, 5, mOutRect);
+        assertEquals(15, mOutRect.left);
+        assertEquals(17, mOutRect.right);
+        assertEquals(30, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.START, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(12, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.START, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(28, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
 
         Gravity.apply(Gravity.RIGHT, 2, 10, mInRect, mOutRect);
         assertEquals(28, mOutRect.left);
@@ -112,6 +169,37 @@
         assertEquals(25, mOutRect.right);
         assertEquals(30, mOutRect.top);
         assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.RIGHT, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(28, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.RIGHT, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(28, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+
+        Gravity.apply(Gravity.END, 2, 10, mInRect, mOutRect);
+        assertEquals(28, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        Gravity.apply(Gravity.END, 2, 10, mInRect, 5, 5, mOutRect);
+        assertEquals(23, mOutRect.left);
+        assertEquals(25, mOutRect.right);
+        assertEquals(30, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.END, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(28, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.END, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(12, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
 
         Gravity.apply(Gravity.CENTER_VERTICAL, 2, 10, mInRect, mOutRect);
         assertEquals(19, mOutRect.left);
@@ -123,6 +211,16 @@
         assertEquals(26, mOutRect.right);
         assertEquals(30, mOutRect.top);
         assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.CENTER_VERTICAL, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.CENTER_VERTICAL, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
 
         Gravity.apply(Gravity.FILL_VERTICAL, 2, 10, mInRect, mOutRect);
         assertEquals(19, mOutRect.left);
@@ -134,6 +232,16 @@
         assertEquals(26, mOutRect.right);
         assertEquals(25, mOutRect.top);
         assertEquals(45, mOutRect.bottom);
+        applyGravity(Gravity.FILL_VERTICAL, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(20, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.FILL_VERTICAL, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(20, mOutRect.top);
+        assertEquals(40, mOutRect.bottom);
 
         Gravity.apply(Gravity.CENTER_HORIZONTAL, 2, 10, mInRect, mOutRect);
         assertEquals(19, mOutRect.left);
@@ -145,6 +253,16 @@
         assertEquals(26, mOutRect.right);
         assertEquals(30, mOutRect.top);
         assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.CENTER_HORIZONTAL, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.CENTER_HORIZONTAL, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(19, mOutRect.left);
+        assertEquals(21, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
 
         Gravity.apply(Gravity.FILL_HORIZONTAL, 2, 10, mInRect, mOutRect);
         assertEquals(10, mOutRect.left);
@@ -156,6 +274,16 @@
         assertEquals(35, mOutRect.right);
         assertEquals(30, mOutRect.top);
         assertEquals(40, mOutRect.bottom);
+        applyGravity(Gravity.FILL_HORIZONTAL, 2, 10, mInRect, mOutRect, false /* LTR direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
+        applyGravity(Gravity.FILL_HORIZONTAL, 2, 10, mInRect, mOutRect, true /* RTL direction */);
+        assertEquals(10, mOutRect.left);
+        assertEquals(30, mOutRect.right);
+        assertEquals(25, mOutRect.top);
+        assertEquals(35, mOutRect.bottom);
     }
 
     @TestTargetNew(
@@ -179,6 +307,7 @@
     public void testIsHorizontal() {
         assertFalse(Gravity.isHorizontal(-1));
         assertTrue(Gravity.isHorizontal(Gravity.HORIZONTAL_GRAVITY_MASK));
+        assertTrue(Gravity.isHorizontal(Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK));
         assertFalse(Gravity.isHorizontal(Gravity.NO_GRAVITY));
     }
 
diff --git a/tests/tests/view/src/android/view/cts/MotionEventTest.java b/tests/tests/view/src/android/view/cts/MotionEventTest.java
index 909ec92..945cefc 100644
--- a/tests/tests/view/src/android/view/cts/MotionEventTest.java
+++ b/tests/tests/view/src/android/view/cts/MotionEventTest.java
@@ -31,6 +31,7 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.MotionEvent.PointerCoords;
+import android.view.MotionEvent.PointerProperties;
 
 /**
  * Test {@link MotionEvent}.
@@ -666,4 +667,32 @@
         assertEquals(9f, copy.orientation);
         assertEquals(10f, coords.getAxisValue(MotionEvent.AXIS_GENERIC_1));
     }
+
+    public void testPointerPropertiesDefaultConstructor() {
+        PointerProperties properties = new PointerProperties();
+
+        assertEquals(MotionEvent.INVALID_POINTER_ID, properties.id);
+        assertEquals(MotionEvent.TOOL_TYPE_UNKNOWN, properties.toolType);
+    }
+
+    public void testPointerPropertiesCopyConstructor() {
+        PointerProperties properties = new PointerProperties();
+        properties.id = 1;
+        properties.toolType = MotionEvent.TOOL_TYPE_MOUSE;
+
+        PointerProperties copy = new PointerProperties(properties);
+        assertEquals(1, copy.id);
+        assertEquals(MotionEvent.TOOL_TYPE_MOUSE, copy.toolType);
+    }
+
+    public void testPointerPropertiesCopyFrom() {
+        PointerProperties properties = new PointerProperties();
+        properties.id = 1;
+        properties.toolType = MotionEvent.TOOL_TYPE_MOUSE;
+
+        PointerProperties copy = new PointerProperties();
+        copy.copyFrom(properties);
+        assertEquals(1, copy.id);
+        assertEquals(MotionEvent.TOOL_TYPE_MOUSE, copy.toolType);
+    }
 }
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index c5f0104..72a6f0d 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -16,15 +16,14 @@
 
 package android.view.cts;
 
-import com.android.cts.stub.R;
-import com.android.internal.view.menu.ContextMenuBuilder;
 import com.google.android.collect.Lists;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
+import com.android.cts.stub.R;
+import com.android.internal.view.menu.ContextMenuBuilder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 import android.app.Activity;
 import android.content.Context;
@@ -39,7 +38,6 @@
 import android.graphics.drawable.StateListDrawable;
 import android.os.Parcelable;
 import android.os.SystemClock;
-import android.provider.Settings;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
 import android.test.UiThreadTest;
@@ -49,6 +47,7 @@
 import android.util.Xml;
 import android.view.ActionMode;
 import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Display;
 import android.view.HapticFeedbackConstants;
 import android.view.KeyEvent;
@@ -56,11 +55,6 @@
 import android.view.SoundEffectConstants;
 import android.view.TouchDelegate;
 import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.WindowManagerImpl;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.View.BaseSavedState;
 import android.view.View.OnClickListener;
 import android.view.View.OnCreateContextMenuListener;
@@ -68,6 +62,11 @@
 import android.view.View.OnKeyListener;
 import android.view.View.OnLongClickListener;
 import android.view.View.OnTouchListener;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.WindowManagerImpl;
+import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
 import android.view.animation.cts.DelayedCheck;
@@ -80,10 +79,11 @@
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.cts.StubActivity;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link View}.
@@ -4378,9 +4378,6 @@
         )
     })
     public void testHapticFeedback() {
-        // Expect true to be returned for a haptic feedback only if haptics are enabled.
-        boolean expectedHapticsReturnValue = Settings.System.getInt(mActivity.getContentResolver(),
-                Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0;
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         final int LONG_PRESS = HapticFeedbackConstants.LONG_PRESS;
         final int FLAG_IGNORE_VIEW_SETTING = HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING;
@@ -4391,12 +4388,11 @@
         assertFalse(view.isHapticFeedbackEnabled());
         assertFalse(view.performHapticFeedback(LONG_PRESS));
         assertFalse(view.performHapticFeedback(LONG_PRESS, FLAG_IGNORE_GLOBAL_SETTING));
-        assertEquals(expectedHapticsReturnValue, view.performHapticFeedback(LONG_PRESS, ALWAYS));
+        assertTrue(view.performHapticFeedback(LONG_PRESS, ALWAYS));
 
         view.setHapticFeedbackEnabled(true);
         assertTrue(view.isHapticFeedbackEnabled());
-        assertEquals(expectedHapticsReturnValue, view.performHapticFeedback(
-                LONG_PRESS, FLAG_IGNORE_GLOBAL_SETTING));
+        assertTrue(view.performHapticFeedback(LONG_PRESS, FLAG_IGNORE_GLOBAL_SETTING));
     }
 
     @TestTargets({
@@ -4443,6 +4439,40 @@
         assertTrue(editText.hasCalledCheckInputConnectionProxy());
     }
 
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setLayoutDirection",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getLayoutDirection",
+            args = {}
+        )
+    })
+    @UiThreadTest
+    public void testLayoutDirection() {
+        View view = new View(mActivity);
+        assertEquals(View.LAYOUT_DIRECTION_INHERIT, view.getLayoutDirection());
+
+        view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+        assertEquals(View.LAYOUT_DIRECTION_LTR, view.getLayoutDirection());
+
+        view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        assertEquals(View.LAYOUT_DIRECTION_RTL, view.getLayoutDirection());
+
+        view.setLayoutDirection(View.LAYOUT_DIRECTION_INHERIT);
+        assertEquals(View.LAYOUT_DIRECTION_INHERIT, view.getLayoutDirection());
+
+        view.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+        assertEquals(View.LAYOUT_DIRECTION_LOCALE, view.getLayoutDirection());
+
+        // View.LAYOUT_DIRECTION_MASK = 0xC0000000
+        view.setLayoutDirection(0xffffffff);
+        assertEquals(0xC0000000, view.getLayoutDirection());
+    }
+
     private static class MockEditText extends EditText {
         private boolean mCalledCheckInputConnectionProxy = false;
         private boolean mCalledOnCreateInputConnection = false;
@@ -4636,6 +4666,10 @@
             return DEFAULT_PARENT_STATE_SET;
         }
 
+        public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
+            return false;
+        }
+
         public static int[] getDefaultParentStateSet() {
             return DEFAULT_PARENT_STATE_SET;
         }
diff --git a/tests/tests/view/src/android/view/cts/View_AnimationTest.java b/tests/tests/view/src/android/view/cts/View_AnimationTest.java
index d071781..144e670 100644
--- a/tests/tests/view/src/android/view/cts/View_AnimationTest.java
+++ b/tests/tests/view/src/android/view/cts/View_AnimationTest.java
@@ -127,9 +127,9 @@
 
         assertSame(mAnimation, view.getAnimation());
 
-        view.clearAnimation();
         runTestOnUiThread(new Runnable() {
             public void run() {
+                view.clearAnimation();
                 view.invalidate();
             }
         });
diff --git a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
index b2bdfc8..51f1201 100644
--- a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
+++ b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
@@ -54,6 +54,8 @@
     public static final String BLANK_PAGE_URL = "webkit/test_blankPage.html";
     public static final String ADD_JAVA_SCRIPT_INTERFACE_URL = "webkit/test_jsInterface.html";
 
+    public static final String FORM_PAGE_URL = "webkit/form_page.html";
+
     public static final String EXT_WEB_URL1 = "http://www.example.com/";
 
     public static final String getFileUrl(String assetName) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebDriverTest.java b/tests/tests/webkit/src/android/webkit/cts/WebDriverTest.java
new file mode 100644
index 0000000..0bb8b3e
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebDriverTest.java
@@ -0,0 +1,953 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package android.webkit.cts;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.webkit.webdriver.By;
+import android.webkit.webdriver.WebDriver;
+import android.webkit.webdriver.WebDriverException;
+import android.webkit.webdriver.WebElement;
+import android.webkit.webdriver.WebElementNotFoundException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static android.webkit.cts.TestHtmlConstants.FORM_PAGE_URL;
+import static android.webkit.cts.TestHtmlConstants.HELLO_WORLD_URL;
+
+/**
+ * Tests for {@link android.webkit.webdriver.WebDriver}.
+ */
+public class WebDriverTest extends
+        ActivityInstrumentationTestCase2<WebDriverStubActivity>{
+    private WebDriver mDriver;
+    private CtsTestServer mWebServer;
+    private static final String SOME_TEXT = "Some text";
+    private static final String DIV_TEXT =
+            "A div Nested text a nested link Foo Nested text";
+    private static final String NESTED_TEXT = "Nested text";
+    private static final String DIV_ID = "divId";
+    private static final String SOME_TEXT_ID = "someTextId";
+    private static final String BAD_ID = "BadId";
+    private static final String NESTED_LINK_ID = "nestedLinkId";
+    private static final String FIRST_DIV = "firstDiv";
+    private static final String INEXISTENT = "inexistent";
+    private static final String ID = "id";
+    private static final String OUTTER = "outter";
+
+    public WebDriverTest() {
+        super(WebDriverStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDriver = getActivity().getDriver();
+        mWebServer = new CtsTestServer(getActivity(), false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWebServer.shutdown();
+        super.tearDown();
+    }
+
+    public void testGetIsBlocking() {
+        mDriver.get(mWebServer.getDelayedAssetUrl(HELLO_WORLD_URL));
+        assertTrue(mDriver.getPageSource().contains("hello world!"));
+    }
+
+    // Navigation
+    public void testNavigateBack() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.id("inner"));
+        link.click();
+        assertEquals("test hello world", mDriver.getTitle());
+        mDriver.navigate().back();
+        assertEquals("Form Test Page", mDriver.getTitle());
+    }
+
+    public void testNavigateForward() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.id("inner"));
+        link.click();
+        mDriver.navigate().back();
+        assertEquals("Form Test Page", mDriver.getTitle());
+        mDriver.navigate().forward();
+        assertEquals("test hello world", mDriver.getTitle());
+    }
+
+    public void testRefresh() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Long result = (Long) mDriver.executeScript(
+                "document.bou = 1;return document.bou;");
+        assertEquals(1, result.intValue());
+        mDriver.navigate().refresh();
+        String result2 = (String) mDriver.executeScript("return document.bou;");
+        assertNull(result2);
+    }
+
+    // getText
+    public void testGetTextReturnsEmptyString() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement emptyLink = mDriver.findElement(By.id("emptyLink"));
+        assertEquals("", emptyLink.getText());
+    }
+
+    // getAttribute
+    public void testGetValidAttribute() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.linkText("Link=equalssign"));
+        assertEquals("foo", link.getAttribute("href"));
+    }
+
+    public void testGetInvalidAttributeReturnsNull() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.linkText("Link=equalssign"));
+        assertNull(link.getAttribute(INEXISTENT));
+    }
+
+    public void testGetAttributeNotSetReturnsNull() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.linkText("Link=equalssign"));
+        assertNull(link.getAttribute(INEXISTENT));
+    }
+
+    // getTagName
+    public void testTagName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement span = mDriver.findElement(By.tagName("span"));
+        assertEquals("SPAN", span.getTagName());
+    }
+
+    // isEnabled
+    public void testIsEnabled() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElement(By.id(DIV_ID));
+        assertTrue(div.isEnabled());
+
+        WebElement input = mDriver.findElement(By.name("inputDisabled"));
+        assertFalse(input.isEnabled());
+    }
+
+    // isSelected
+    public void testIsSelected() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement optionOne = mDriver.findElement(By.id("one"));
+        assertTrue(optionOne.isSelected());
+
+        WebElement optionTwo = mDriver.findElement(By.id("two"));
+        assertFalse(optionTwo.isSelected());
+
+        WebElement selectEggs = mDriver.findElement(By.id("eggs"));
+        assertTrue(selectEggs.isSelected());
+
+        WebElement selectHam = mDriver.findElement(By.id("ham"));
+        assertFalse(selectHam.isSelected());
+
+        WebElement inputCheese = mDriver.findElement(By.id("cheese"));
+        assertFalse(inputCheese.isSelected());
+
+        WebElement inputCheesePeas = mDriver.findElement(
+                By.id("cheese_and_peas"));
+        assertTrue(inputCheesePeas.isSelected());
+    }
+
+    public void testIsSelectedOnHiddenInputThrows() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement inputHidden = mDriver.findElement(By.name("hidden"));
+        try {
+            inputHidden.isSelected();
+            fail();
+        } catch (WebDriverException e) {
+            // This is expcted
+        }
+    }
+
+    public void testIsSelectedOnNonSelectableElementThrows() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link= mDriver.findElement(By.linkText("Foo"));
+        try {
+            link.isSelected();
+            fail();
+        } catch (WebDriverException e) {
+            // This is expected
+        }
+    }
+
+    // toogle
+    public void testToggleCheckbox() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement check = mDriver.findElement(By.id("checky"));
+        assertFalse(check.isSelected());
+        assertTrue(check.toggle());
+        assertFalse(check.toggle());
+    }
+
+    public void testToggleOnNonTogglableElements() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement inputHidden = mDriver.findElement(By.name("hidden"));
+        try {
+            inputHidden.toggle();
+            fail();
+        } catch (WebDriverException e) {
+            // This is expected
+        }
+    }
+
+    // getCssValue
+    public void testGetCssValue() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement text = mDriver.findElement(By.name("textinput"));
+        assertEquals("red", text.getCssValue("background-color"));
+    }
+
+    public void testGetCssValueReturnsNullWhenPropertyNotFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement text = mDriver.findElement(By.name("textinput"));
+        assertNull(text.getCssValue(INEXISTENT));
+    }
+
+    // getSize
+    public void testGetSize() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement text = mDriver.findElements(By.name("textinput")).get(0);
+        assertEquals(100, text.getSize().x);
+        assertEquals(50, text.getSize().y);
+    }
+
+    // getLocation
+    public void testGetLocation () {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement tag = mDriver.findElement(By.linkText("Tag A"));
+        assertEquals(8, tag.getLocation().x);
+        assertEquals(8, tag.getLocation().y);
+    }
+
+    // isDisplayed
+    public void testIsDisplayed() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement hidden = mDriver.findElement(By.id("fromage"));
+        assertFalse(hidden.isDisplayed());
+        WebElement checky = mDriver.findElement(By.id("checky"));
+        assertTrue(checky.isDisplayed());
+    }
+
+    // click
+    public void testClickOnWebElement() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.id("inner"));
+        link.click();
+        assertEquals("test hello world", mDriver.getTitle());
+    }
+
+    // sendKeys
+    public void testSendKeys() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement type = mDriver.findElement(By.id("typehere"));
+        assertEquals("", type.getAttribute("value"));
+        type.sendKeys("hello");
+
+        assertEquals("hello", type.getAttribute("value"));
+        type.sendKeys(" ", "world", "!");
+        assertEquals("hello world!", type.getAttribute("value"));
+    }
+
+    // submit
+    public void testSubmit() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement link = mDriver.findElement(By.id("fromage"));
+        link.submit();
+        assertEquals("test hello world", mDriver.getTitle());
+    }
+
+    // clear
+    public void testClear() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement type = mDriver.findElement(By.id("typehere"));
+        assertEquals("", type.getAttribute("value"));
+        type.sendKeys("hello");
+        assertEquals("hello", type.getAttribute("value"));
+        type.clear();
+        assertEquals("", type.getAttribute("value"));
+    }
+
+    // findElement
+    public void testFindElementThrowsIfNoPageIsLoaded() {
+        try {
+            mDriver.findElement(By.id(SOME_TEXT_ID));
+            fail();
+        } catch (WebDriverException e) {
+            // this is expected
+        }
+    }
+
+    // findElements
+    public void testFindElementsThrowsIfNoPageIsLoaded() {
+        try {
+            mDriver.findElements(By.id(SOME_TEXT_ID));
+            fail();
+        } catch (WebDriverException e) {
+            // this is expected
+        }
+    }
+
+    // By id
+    public void testFindElementById() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.id(SOME_TEXT_ID));
+        assertTrue(SOME_TEXT.equals(element.getText()));
+
+        element = mDriver.findElement(By.id(DIV_ID));
+        assertTrue(DIV_TEXT.equals(element.getText()));
+    }
+
+    public void testFindElementByIdThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.id(BAD_ID));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementById() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.id(NESTED_LINK_ID));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsById() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.id(ID + "3"));
+        assertEquals(2, elements.size());
+        assertEquals("A paragraph", elements.get(1).getText());
+    }
+
+    public void testFindElementsByIdReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.id(INEXISTENT));
+        assertNotNull(elements);
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsById() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElement(By.name(FIRST_DIV));
+        List<WebElement> elements = div.findElements(By.id("n1"));
+        assertEquals(2, elements.size());
+        assertEquals("spann1", elements.get(1).getAttribute("name"));
+    }
+
+    // By linkText
+    public void testFindElementByLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.linkText("Nested text"));
+        assertTrue(NESTED_LINK_ID.equals(element.getAttribute(ID)));
+    }
+
+    public void testFindElementByLinkTextThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.linkText(INEXISTENT));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.linkText("Foo"));
+        assertTrue("inner".equals(nestedNode.getAttribute(ID)));
+    }
+
+    public void testFindElementsByLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.linkText("Foo"));
+        assertEquals(4, elements.size());
+    }
+
+    public void testFindElementsByLinkTextReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.linkText("Boo"));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElement(By.name(FIRST_DIV));
+        List<WebElement> elements =
+                div.findElements(By.linkText("Nested text"));
+        assertEquals(2, elements.size());
+    }
+
+    // By partialLinkText
+    public void testFindElementByPartialLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.partialLinkText("text"));
+        assertTrue(SOME_TEXT.equals(element.getText()));
+    }
+
+    public void testFindElementByPartialLinkTextThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.partialLinkText(INEXISTENT));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByPartialLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.partialLinkText("text"));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByPartialLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements =
+                mDriver.findElements(By.partialLinkText("text"));
+        assertTrue(elements.size() > 2);
+    }
+
+    public void
+    testFindElementsByPartialLinkTextReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements =
+                mDriver.findElements(By.partialLinkText(INEXISTENT));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByPartialLinkText() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElements(By.name(FIRST_DIV)).get(0);
+        List<WebElement> elements =
+                div.findElements(By.partialLinkText("text"));
+        assertEquals(2, elements.size());
+    }
+
+    // by name
+    public void testFindElementByName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.name("foo"));
+        assertTrue(OUTTER.equals(element.getAttribute(ID)));
+    }
+
+    public void testFindElementByNameThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.name(INEXISTENT));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.name("nestedLink"));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.name("text"));
+        assertEquals(2, elements.size());
+    }
+
+    public void testFindElementsByNameReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.name(INEXISTENT));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElements(By.xpath(
+                "//div[@" + ID + "='divId']"))
+                .get(0);
+        List<WebElement> elements = div.findElements(By.name("foo"));
+        assertEquals(1, elements.size());
+    }
+
+    // By tagName
+    public void testFindElementByTagName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.tagName("a"));
+        assertTrue("Tag A".equals(element.getText()));
+    }
+
+    public void testFindElementByTagNameThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.tagName(INEXISTENT));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByTagName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.tagName("a"));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByTagName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.tagName("a"));
+        assertTrue(elements.size() > 0);
+    }
+
+    public void testFindElementsByTagNameReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(
+                By.tagName(INEXISTENT));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByTagName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElement(By.xpath(
+                "//div[@" + ID + "='divId']"));
+        List<WebElement> elements = div.findElements(By.tagName("span"));
+        assertEquals(1, elements.size());
+    }
+
+    // By xpath
+    public void testFindElementByXPath() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element =
+                mDriver.findElement(By.xpath(
+                "//a[@" + ID + "=\"someTextId\"]"));
+        assertTrue(SOME_TEXT.equals(element.getText()));
+
+        element = mDriver.findElement(By.xpath("//div[@name='firstDiv']"));
+        assertTrue(DIV_TEXT.equals(element.getText()));
+    }
+
+    public void testFindElementByXPathThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.xpath("//a[@" + ID + "='inexistant']"));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByXPath() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.xpath(
+                "//div[@" + ID + "='divId']"));
+        WebElement nestedNode = parent.findElement(
+                By.xpath(".//a[@" + ID + "='nestedLinkId']"));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByXPath() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(
+                By.xpath("//a[@name='foo']"));
+        assertTrue(elements.size() > 1);
+    }
+
+    public void testFindElementsByXPathReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements =
+                mDriver.findElements(By.xpath(
+                        "//a[@" + ID + "='inexistant']"));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByXPath() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElements(By.xpath(
+                "//div[@" + ID + "='divId']"))
+                .get(0);
+        List<WebElement> elements = div.findElements(
+                By.xpath(".//a[@name='foo']"));
+        assertEquals(1, elements.size());
+    }
+
+    public void testFindElementByXpathWithInvalidXPath() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.xpath("//a@" + ID + "=inexistant']"));
+            fail("This should have failed.");
+        } catch (WebDriverException e) {
+            // This is expected
+        }
+    }
+
+    // By className
+    public void testFindElementByClassName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.className(" spaceAround "));
+        assertTrue("Spaced out".equals(element.getText()));
+    }
+
+    public void testFindElementByClassNameThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.className("bou"));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByClassName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(By.className("divClass"));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByClassName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements =
+                mDriver.findElements(By.className("divClass"));
+        assertTrue(elements.size() > 1);
+    }
+
+    public void testFindElementsByClassNameReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements =
+                mDriver.findElements(By.className(INEXISTENT));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByClassName() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        List<WebElement> nested =
+                parent.findElements(By.className("divClass"));
+        assertTrue(nested.size() > 0);
+    }
+
+    // By css
+    public void testFindElementByCss() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement element = mDriver.findElement(By.css("#" + "outter"));
+        assertTrue("Foo".equals(element.getText()));
+    }
+
+    public void testFindElementByCssThrowsIfElementDoesNotExists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.findElement(By.css("bou.foo"));
+            fail("This should have failed.");
+        } catch (WebElementNotFoundException e) {
+            // This is expected
+        }
+    }
+
+    public void testFindNestedElementByCss() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        WebElement nestedNode = parent.findElement(
+                By.css("#" + NESTED_LINK_ID));
+        assertTrue(NESTED_TEXT.equals(nestedNode.getText()));
+    }
+
+    public void testFindElementsByCss() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(
+                By.css("#" + SOME_TEXT_ID));
+        assertTrue(elements.size() > 0);
+    }
+
+    public void testFindElementsByCssReturnsEmptyListIfNoResultsFound() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> elements = mDriver.findElements(By.css("bou.foo"));
+        assertEquals(0, elements.size());
+    }
+
+    public void testFindNestedElementsByCss() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement parent = mDriver.findElement(By.id(DIV_ID));
+        List<WebElement> nested = parent.findElements(
+                By.css("#" + NESTED_LINK_ID));
+        assertEquals(1, nested.size());
+    }
+
+    public void testExecuteScriptShouldReturnAString() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Object result = mDriver.executeScript("return document.title");
+        assertEquals("Form Test Page", (String) result);
+    }
+
+    public void testExecuteScriptShouldReturnAWebElement() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Object result = mDriver.executeScript(
+                "return document.getElementsByTagName('div')[0];");
+        assertTrue(result instanceof WebElement);
+        assertEquals(DIV_TEXT, ((WebElement) result).getText());
+    }
+
+    public void testExecuteScriptShouldPassAndReturnADouble() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Double expected = new Double(1.2);
+        Object result = mDriver.executeScript("return arguments[0];", expected);
+        assertTrue(result instanceof Double);
+        assertEquals(expected, (Double) result);
+    }
+
+    public void testExecuteScriptShouldPassAndReturnALong() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Long expected = new Long(1);
+        Object result = mDriver.executeScript("return arguments[0];", expected);
+        assertTrue(result instanceof Long);
+        assertEquals(expected, (Long) result);
+    }
+
+    public void testExecuteScriptShouldPassReturnABoolean() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Boolean expected = new Boolean(true);
+        Object result = mDriver.executeScript("return arguments[0] === true;",
+                expected);
+        assertTrue(result instanceof Boolean);
+        assertEquals(expected, (Boolean) result);
+    }
+
+    public void testExecuteScriptShouldReturnAList() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<String> expected = new ArrayList();
+        expected.add("one");
+        expected.add("two");
+        expected.add("three");
+
+        Object result = mDriver.executeScript(
+                "return ['one', 'two', 'three'];");
+
+        assertTrue(expected.equals((List<String>) result));
+    }
+
+    public void testExecuteScriptShouldReturnNestedList() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<Object> expected = new ArrayList();
+        expected.add("one");
+        List<Object> nestedList = new ArrayList();
+        nestedList.add(true);
+        nestedList.add(false);
+        expected.add(nestedList);
+        Map<String, Object> nestedMap = new HashMap();
+        nestedMap.put("bread", "cheese");
+        nestedMap.put("hungry", true);
+        expected.add(nestedMap);
+
+        Object result = mDriver.executeScript(
+                "return ['one', [true, false], "
+                + "{bread:'cheese', hungry:true}];");
+
+        assertTrue(expected.equals(result));
+    }
+
+    public void testExecuteScriptShouldBeAbleToReturnALisOfwebElements() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<WebElement> result = (List<WebElement>) mDriver.executeScript(
+                "return document.getElementsByTagName('a')");
+        assertTrue(result.size() > 1);
+    }
+
+    public void testExecuteScriptShouldReturnAMap() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Map<String, Object> expected = new HashMap();
+        expected.put("abc", Long.valueOf(123));
+        expected.put("cat", false);
+        Map<String, Object> nestedMap = new HashMap();
+        nestedMap.put("bread", "cheese");
+        nestedMap.put("hungry", true);
+        expected.put("map", nestedMap);
+        List<String> nestedList = new ArrayList();
+        nestedList.add("bou");
+        nestedList.add("truc");
+        expected.put("list", nestedList);
+
+        Object res = mDriver.executeScript("return {abc:123, cat:false, "
+                + "map:{bread:'cheese', hungry:true}, list:['bou', 'truc']};");
+        assertTrue(res instanceof Map);
+        Map<String, Object> result = (Map<String, Object>) res;
+        assertEquals(expected.size(), result.size());
+
+        assertTrue(expected.equals(result));
+    }
+
+    public void testExecuteScriptShouldThrowIfJsIsBad() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.executeScript("return bou();");
+            fail("This should have failed");
+        } catch (WebDriverException e) {
+            // This is expected.
+        }
+    }
+
+    public void testExecuteScriptShouldbeAbleToPassAString() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        String expected = "bou";
+        Object result = mDriver.executeScript("return arguments[0]", expected);
+        assertEquals(expected, (String) result);
+    }
+
+    public void testExecuteScriptShouldBeAbleToPassWebElement() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        WebElement div = mDriver.findElement(By.id(DIV_ID));
+        Object result = mDriver.executeScript(
+                "arguments[0]['flibble'] = arguments[0].getAttribute('"
+                + ID + "');"
+                + "return arguments[0]['flibble'];", div);
+        assertEquals(DIV_ID, (String) result);
+    }
+
+    public void testExecuteScriptShouldBeAbleToPassAList() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<String> expected = new ArrayList();
+        expected.add("apple");
+        expected.add("cheese");
+        expected.add("food");
+
+        Object result = mDriver.executeScript(
+                "return arguments[0].length", expected);
+        assertEquals(expected.size(), ((Long) result).intValue());
+    }
+
+    public void testExecuteScriptShouldBeAbleToPassNestedLists() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        List<Object> expected = new ArrayList();
+        expected.add("apple");
+        expected.add("cheese");
+        List<Integer> nested = new ArrayList();
+        nested.add(1);
+        nested.add(2);
+        expected.add(nested);
+        expected.add("food");
+
+        Object result = mDriver.executeScript(
+                "return arguments[0][2].length", expected);
+        assertEquals(nested.size(), ((Long) result).intValue());
+    }
+
+    public void testExecuteScriptShouldBeAbleToPassAMap() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Map<String, String> expected = new HashMap();
+        expected.put("apple", "pie");
+        expected.put("cheese", "cake");
+
+        Object result = mDriver.executeScript(
+                "return arguments[0].apple", expected);
+        assertEquals(expected.get("apple"), (String) result);
+    }
+
+    public void testExecuteScriptShouldBeAbleToPassNestedMaps() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Map<String, Object> expected = new HashMap();
+        expected.put("apple", "pie");
+        Map<String, String> nested = new HashMap();
+        nested.put("foo", "boo");
+        expected.put("nested", nested);
+        expected.put("cheese", "cake");
+
+        Object result = mDriver.executeScript(
+                "return arguments[0].nested.foo", expected);
+        assertEquals(((Map<String, Object>)expected.get("nested")).get("foo"),
+                (String) result);
+    }
+
+
+    public void testExecuteScriptShouldThrowIfArgumentIsNotValid() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        try {
+            mDriver.executeScript("return arguments[0];", mDriver);
+            fail("This should have failed");
+        } catch (IllegalArgumentException e) {
+            // This is expected.
+        }
+    }
+
+    public void testExecuteScriptHandlesStringCorrectly() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        String cheese = "cheese";
+        String bread = "bread";
+        Object result = mDriver.executeScript(
+                "return 'I love ' + arguments[0] + ' and ' + arguments[1]",
+                cheese, bread);
+        assertEquals("I love cheese and bread", (String) result);
+    }
+
+    public void testExecuteScriptShouldThrowIfNoPageLoaded() {
+        try {
+            mDriver.executeScript("return 'bou';");
+            fail("This should have failed");
+        } catch (WebDriverException e) {
+            // This is expected.
+        }
+    }
+
+    public void testExecuteScriptShouldBeAbleToCreatePersistentValue() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        mDriver.executeScript("document.b" + ID + "ule = ['hello']");
+        Object result = mDriver.executeScript(
+                "return document.b" + ID + "ule.shift();");
+        assertEquals("hello", (String) result);
+    }
+
+    public void testExecuteScriptEscapesQuotesAndBackslash() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return \"foo'\\\"\" == arguments[0];", "foo'\""));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return \"foo'\\\"bar\" == arguments[0];", "foo'\"bar"));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return 'foo\"' == arguments[0];", "foo\""));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return \"foo'\" == arguments[0];", "foo'"));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return \"foo\\\\\\\"\" == arguments[0];", "foo\\\""));
+        assertTrue((Boolean) mDriver.executeScript(
+                "return \"f\\\"o\\\\o\\\\\\\\\\\"\" == arguments[0];",
+                "f\"o\\o\\\\\""));
+    }
+
+    public void testExecuteScriptReturnsNull() {
+        mDriver.get(mWebServer.getAssetUrl(FORM_PAGE_URL));
+        Object result = mDriver.executeScript("return null;");
+        assertNull(result);
+        result = mDriver.executeScript("return undefined;");
+        assertNull(result);
+    }
+
+    public void testExecuteScriptShouldThrowIfNoPageIsLoaded() {
+        try {
+            Object result = mDriver.executeScript("return null;");
+            fail();
+        } catch (Exception e) {
+
+        }
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 94fe857..52b31e3 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -44,12 +44,14 @@
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.animation.cts.DelayedCheck;
 import android.webkit.CacheManager;
 import android.webkit.CacheManager.CacheResult;
+import android.webkit.ConsoleMessage;
 import android.webkit.DownloadListener;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebBackForwardList;
@@ -66,20 +68,30 @@
 import java.io.File;
 import java.io.FileInputStream;
 
+import junit.framework.Assert;
+
 @TestTargetClass(android.webkit.WebView.class)
 public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+    private static final String LOGTAG = "WebViewTest";
     private static final int INITIAL_PROGRESS = 100;
     private static long TEST_TIMEOUT = 20000L;
     private static long TIME_FOR_LAYOUT = 1000L;
 
     private WebView mWebView;
     private CtsTestServer mWebServer;
+    private boolean mIsUiThreadDone;
 
     public WebViewTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
     }
 
     @Override
+    public void runTestOnUiThread(Runnable runnable) throws Throwable {
+        mIsUiThreadDone = false;
+        super.runTestOnUiThread(runnable);
+    }
+
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         mWebView = getActivity().getWebView();
@@ -91,8 +103,16 @@
 
     @Override
     protected void tearDown() throws Exception {
-        mWebView.clearHistory();
-        mWebView.clearCache(true);
+        try {
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    mWebView.clearHistory();
+                    mWebView.clearCache(true);
+                }
+            });
+        } catch(Throwable t) {
+            Log.w(LOGTAG, "tearDown(): Caught exception when posting Runnable to UI thread");
+        }
         if (mWebServer != null) {
             mWebServer.shutdown();
         }
@@ -121,6 +141,7 @@
             args = {Context.class, AttributeSet.class, int.class}
         )
     })
+    @UiThreadTest
     public void testConstructor() {
         new WebView(getActivity());
         new WebView(getActivity(), null);
@@ -132,6 +153,7 @@
         method = "findAddress",
         args = {String.class}
     )
+    @UiThreadTest
     public void testFindAddress() {
         /*
          * Info about USPS
@@ -187,12 +209,13 @@
         args = {},
         notes = "Cannot test the effect of this method"
     )
+    @UiThreadTest
     public void testInvokeZoomPicker() throws Exception {
         WebSettings settings = mWebView.getSettings();
         assertTrue(settings.supportZoom());
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        assertLoadUrlSuccessfully(url);
         mWebView.invokeZoomPicker();
     }
 
@@ -338,6 +361,7 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testScrollBarOverlay() throws Throwable {
         mWebView.setHorizontalScrollbarOverlay(true);
         mWebView.setVerticalScrollbarOverlay(false);
@@ -372,6 +396,7 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testLoadUrl() throws Exception {
         assertNull(mWebView.getUrl());
         assertNull(mWebView.getOriginalUrl());
@@ -380,7 +405,7 @@
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         mWebView.loadUrl(url);
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals(100, mWebView.getProgress());
         assertEquals(url, mWebView.getUrl());
         assertEquals(url, mWebView.getOriginalUrl());
@@ -399,6 +424,7 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testGetOriginalUrl() throws Exception {
         assertNull(mWebView.getUrl());
         assertNull(mWebView.getOriginalUrl());
@@ -410,7 +436,7 @@
         mWebView.setWebViewClient(new WebViewClient());
         mWebView.loadUrl(redirect);
 
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals(url, mWebView.getUrl());
         assertEquals(redirect, mWebView.getOriginalUrl());
     }
@@ -420,6 +446,7 @@
         method = "stopLoading",
         args = {}
     )
+    @UiThreadTest
     public void testStopLoading() throws Exception {
         assertNull(mWebView.getUrl());
         assertEquals(INITIAL_PROGRESS, mWebView.getProgress());
@@ -469,6 +496,7 @@
             args = {int.class}
         )
     })
+    @UiThreadTest
     public void testGoBackAndForward() throws Exception {
         assertGoBackOrForwardBySteps(false, -1);
         assertGoBackOrForwardBySteps(false, 1);
@@ -478,17 +506,17 @@
         String url2 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2);
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
-        assertLoadUrlSuccessfully(mWebView, url1);
+        assertLoadUrlSuccessfully(url1);
         delayedCheckWebBackForwardList(url1, 0, 1);
         assertGoBackOrForwardBySteps(false, -1);
         assertGoBackOrForwardBySteps(false, 1);
 
-        assertLoadUrlSuccessfully(mWebView, url2);
+        assertLoadUrlSuccessfully(url2);
         delayedCheckWebBackForwardList(url2, 1, 2);
         assertGoBackOrForwardBySteps(true, -1);
         assertGoBackOrForwardBySteps(false, 1);
 
-        assertLoadUrlSuccessfully(mWebView, url3);
+        assertLoadUrlSuccessfully(url3);
         delayedCheckWebBackForwardList(url3, 2, 3);
         assertGoBackOrForwardBySteps(true, -2);
         assertGoBackOrForwardBySteps(false, 1);
@@ -519,24 +547,49 @@
         method = "addJavascriptInterface",
         args = {Object.class, String.class}
     )
+    @UiThreadTest
     public void testAddJavascriptInterface() throws Exception {
         WebSettings settings = mWebView.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
 
+        final class DummyJavaScriptInterface {
+            private boolean mWasProvideResultCalled;
+            private String mResult;
+
+            private synchronized String waitForResult() {
+                while (!mWasProvideResultCalled) {
+                    try {
+                        wait(TEST_TIMEOUT);
+                    } catch (InterruptedException e) {
+                        continue;
+                    }
+                    if (!mWasProvideResultCalled) {
+                        Assert.fail("Unexpected timeout");
+                    }
+                }
+                return mResult;
+            }
+
+            public synchronized boolean wasProvideResultCalled() {
+                return mWasProvideResultCalled;
+            }
+
+            public synchronized void provideResult(String result) {
+                mWasProvideResultCalled = true;
+                mResult = result;
+                notify();
+            }
+        }
+
         final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
         mWebView.addJavascriptInterface(obj, "dummy");
-        assertFalse(obj.hasChangedTitle());
+        assertFalse(obj.wasProvideResultCalled());
 
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.ADD_JAVA_SCRIPT_INTERFACE_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
-        new DelayedCheck() {
-            @Override
-            protected boolean check() {
-                return obj.hasChangedTitle();
-            }
-        }.run();
+        assertLoadUrlSuccessfully(url);
+        assertEquals("Original title", obj.waitForResult());
     }
 
     @TestTargetNew(
@@ -544,6 +597,7 @@
         method = "addJavascriptInterface",
         args = {Object.class, String.class}
     )
+    @UiThreadTest
     public void testAddJavascriptInterfaceNullObject() throws Exception {
         WebSettings settings = mWebView.getSettings();
         settings.setJavaScriptEnabled(true);
@@ -552,26 +606,26 @@
 
         // Test that the property is initially undefined.
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("undefined", mWebView.getTitle());
 
         // Test that adding a null object has no effect.
         mWebView.addJavascriptInterface(null, "injectedObject");
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("undefined", mWebView.getTitle());
 
         // Test that adding an object gives an object type.
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
+        final Object obj = new Object();
         mWebView.addJavascriptInterface(obj, "injectedObject");
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("object", mWebView.getTitle());
 
         // Test that trying to replace with a null object has no effect.
         mWebView.addJavascriptInterface(null, "injectedObject");
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("object", mWebView.getTitle());
     }
 
@@ -587,10 +641,11 @@
             args = {String.class}
         )
     })
+    @UiThreadTest
     public void testAddJavascriptInterfaceOddName() throws Exception {
         WebSettings settings = mWebView.getSettings();
         settings.setJavaScriptEnabled(true);
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
+        final Object obj = new Object();
 
         // We should be able to use any character other than a single quote.
         // TODO: We currently fail when the name contains '#', '\', '\n' or '\r'.
@@ -606,12 +661,12 @@
 
             mWebView.addJavascriptInterface(obj, name);
             mWebView.loadData(Uri.encode(setTitleToPropertyTypeHtml), "text/html", "UTF-8");
-            waitForLoadComplete(mWebView, TEST_TIMEOUT);
+            waitForLoadComplete();
             assertEquals("object", mWebView.getTitle());
 
             mWebView.removeJavascriptInterface(name);
             mWebView.loadData(Uri.encode(setTitleToPropertyTypeHtml), "text/html", "UTF-8");
-            waitForLoadComplete(mWebView, TEST_TIMEOUT);
+            waitForLoadComplete();
             assertEquals("undefined", mWebView.getTitle());
         }
     }
@@ -621,6 +676,7 @@
         method = "removeJavascriptInterface",
         args = {String.class}
     )
+    @UiThreadTest
     public void testRemoveJavascriptInterface() throws Exception {
         WebSettings settings = mWebView.getSettings();
         settings.setJavaScriptEnabled(true);
@@ -628,19 +684,74 @@
                 "<body onload=\"document.title = typeof window.injectedObject;\"></body></html>";
 
         // Test that adding an object gives an object type.
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
-        mWebView.addJavascriptInterface(obj, "injectedObject");
+        mWebView.addJavascriptInterface(new Object(), "injectedObject");
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("object", mWebView.getTitle());
 
-        // Test that removing the object leaves the property undefined.
+        // Test that reloading the page after removing the object leaves the property undefined.
         mWebView.removeJavascriptInterface("injectedObject");
         mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("undefined", mWebView.getTitle());
     }
 
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "removeJavascriptInterface",
+        args = {String.class}
+    )
+    public void testUseRemovedJavascriptInterface() throws Throwable {
+        class RemovedObject {
+            @Override
+            public String toString() {
+                return "removedObject";
+            }
+            public void remove() throws Throwable {
+                runTestOnUiThread(new Runnable() {
+                    public void run() {
+                        mWebView.removeJavascriptInterface("removedObject");
+                        System.gc();
+                    }
+                });
+            }
+        }
+        class ResultObject {
+            private String mResult;
+            private boolean mIsResultAvailable;
+            public synchronized void setResult(String result) {
+                mResult = result;
+                mIsResultAvailable = true;
+                notify();
+            }
+            public synchronized String getResult() {
+                while (!mIsResultAvailable) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                    }
+                }
+                return mResult;
+            }
+        }
+        final ResultObject resultObject = new ResultObject();
+
+        // Test that an object is still usable if removed while the page is in use, even if we have
+        // no external references to it.
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.getSettings().setJavaScriptEnabled(true);
+                mWebView.addJavascriptInterface(new RemovedObject(), "removedObject");
+                mWebView.addJavascriptInterface(resultObject, "resultObject");
+                mWebView.loadData("<html><head></head>" +
+                        "<body onload=\"window.removedObject.remove();" +
+                        "resultObject.setResult(removedObject.toString());\"></body></html>",
+                        "text/html", "UTF-8");
+            }
+        });
+        assertEquals("removedObject", resultObject.getResult());
+    }
+
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
@@ -658,27 +769,55 @@
             args = {}
         )
     })
-    public void testCapturePicture() throws Exception {
+    public void testCapturePicture() throws Exception, Throwable {
         startWebServer(false);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
-        // showing the blank page will make the picture filled with background color
-        assertLoadUrlSuccessfully(mWebView, url);
-        Picture p = mWebView.capturePicture();
-        Bitmap b = Bitmap.createBitmap(p.getWidth(), p.getHeight(), Config.ARGB_8888);
-        p.draw(new Canvas(b));
-        // default color is white
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                // showing the blank page will make the picture filled with background color
+                mWebView.loadUrl(url);
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        class PictureRunnable implements Runnable {
+            private Picture mPicture;
+            public void run() {
+                mPicture = mWebView.capturePicture();
+                Bitmap b = Bitmap.createBitmap(mPicture.getWidth(), mPicture.getHeight(),
+                        Config.ARGB_8888);
+                mPicture.draw(new Canvas(b));
+                // default color is white
+                assertBitmapFillWithColor(b, Color.WHITE);
+
+                mWebView.setBackgroundColor(Color.CYAN);
+                mWebView.reload();
+                waitForLoadComplete();
+            }
+            public Picture getPicture() {
+                return mPicture;
+            }
+        }
+        PictureRunnable runnable = new PictureRunnable();
+        runTestOnUiThread(runnable);
+        getInstrumentation().waitForIdleSync();
+
+        // the content of the picture will not be updated automatically
+        Picture picture = runnable.getPicture();
+        Bitmap b = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Config.ARGB_8888);
+        picture.draw(new Canvas(b));
         assertBitmapFillWithColor(b, Color.WHITE);
 
-        mWebView.setBackgroundColor(Color.CYAN);
-        mWebView.reload();
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        // the content of the picture will not be updated automatically
-        p.draw(new Canvas(b));
-        assertBitmapFillWithColor(b, Color.WHITE);
-        // update the content
-        p = mWebView.capturePicture();
-        p.draw(new Canvas(b));
-        assertBitmapFillWithColor(b, Color.CYAN);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                // update the content
+                Picture p = mWebView.capturePicture();
+                Bitmap b = Bitmap.createBitmap(p.getWidth(), p.getHeight(), Config.ARGB_8888);
+                p.draw(new Canvas(b));
+                assertBitmapFillWithColor(b, Color.CYAN);
+            }
+        });
     }
 
     @TestTargetNew(
@@ -686,12 +825,28 @@
         method = "setPictureListener",
         args = {PictureListener.class}
     )
-    public void testSetPictureListener() throws Exception {
+    public void testSetPictureListener() throws Exception, Throwable {
+        final class MyPictureListener implements PictureListener {
+            public int callCount;
+            public WebView webView;
+            public Picture picture;
+
+            public void onNewPicture(WebView view, Picture picture) {
+                this.callCount += 1;
+                this.webView = view;
+                this.picture = picture;
+            }
+        }
+
         final MyPictureListener listener = new MyPictureListener();
-        mWebView.setPictureListener(listener);
         startWebServer(false);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.setPictureListener(listener);
+                assertLoadUrlSuccessfully(url);
+            }
+        });
         new DelayedCheck(TEST_TIMEOUT) {
             protected boolean check() {
                 return listener.callCount > 0;
@@ -701,8 +856,12 @@
         assertNotNull(listener.picture);
 
         final int oldCallCount = listener.callCount;
-        url = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        final String newUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertLoadUrlSuccessfully(newUrl);
+            }
+        });
         new DelayedCheck(TEST_TIMEOUT) {
             protected boolean check() {
                 return listener.callCount > oldCallCount;
@@ -731,8 +890,13 @@
     public void testSaveAndRestorePicture() throws Throwable {
         mWebView.setBackgroundColor(Color.CYAN);
         startWebServer(false);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertLoadUrlSuccessfully(url);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
         final Bundle bundle = new Bundle();
         final File f = getActivity().getFileStreamPath("snapshot");
@@ -743,7 +907,11 @@
         try {
             assertTrue(bundle.isEmpty());
             assertEquals(0, f.length());
-            assertTrue(mWebView.savePicture(bundle, f));
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    assertTrue(mWebView.savePicture(bundle, f));
+                }
+            });
 
             // File saving is done in a separate thread.
             new DelayedCheck() {
@@ -760,15 +928,22 @@
             p.draw(new Canvas(b));
             assertBitmapFillWithColor(b, Color.CYAN);
 
-            mWebView.setBackgroundColor(Color.WHITE);
-            mWebView.reload();
-            waitForLoadComplete(mWebView, TEST_TIMEOUT);
-
-            b = Bitmap.createBitmap(mWebView.getWidth(), mWebView.getHeight(), Config.ARGB_8888);
-            mWebView.draw(new Canvas(b));
-            assertBitmapFillWithColor(b, Color.WHITE);
             runTestOnUiThread(new Runnable() {
                 public void run() {
+                    mWebView.setBackgroundColor(Color.WHITE);
+                    mWebView.reload();
+                    waitForLoadComplete();
+                }
+            });
+            getInstrumentation().waitForIdleSync();
+
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    Bitmap b = Bitmap.createBitmap(mWebView.getWidth(), mWebView.getHeight(),
+                            Config.ARGB_8888);
+                    mWebView.draw(new Canvas(b));
+                    assertBitmapFillWithColor(b, Color.WHITE);
+
                     assertTrue(mWebView.restorePicture(bundle, f));
                 }
             });
@@ -794,6 +969,7 @@
             args = {String.class, String.class}
         )
     })
+    @UiThreadTest
     public void testAccessHttpAuthUsernamePassword() {
         try {
             WebViewDatabase.getInstance(getActivity()).clearHttpAuthUsernamePassword();
@@ -860,6 +1036,7 @@
         method = "savePassword",
         args = {String.class, String.class, String.class}
     )
+    @UiThreadTest
     public void testSavePassword() {
         WebViewDatabase db = WebViewDatabase.getInstance(getActivity());
         try {
@@ -898,27 +1075,54 @@
             args = {}
         )
     })
-    public void testLoadData() throws Exception {
-        assertNull(mWebView.getTitle());
-        mWebView.loadData("<html><head><title>Hello,World!</title></head><body></body></html>",
-                "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals("Hello,World!", mWebView.getTitle());
+    public void testLoadData() throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertNull(mWebView.getTitle());
+                mWebView.loadData("<html><head><title>Hello,World!</title></head><body></body>" +
+                        "</html>",
+                        "text/html", "UTF-8");
+                waitForLoadComplete();
+                assertEquals("Hello,World!", mWebView.getTitle());
+            }
+        });
 
+        // Test that JavaScript can't access cross-origin content.
+        class ConsoleMessageWebChromeClient extends WebChromeClient {
+            private boolean mIsMessageLevelAvailable;
+            private ConsoleMessage.MessageLevel mMessageLevel;
+            @Override
+            public synchronized boolean onConsoleMessage(ConsoleMessage message) {
+                mMessageLevel = message.messageLevel();
+                mIsMessageLevelAvailable = true;
+                notify();
+                return true;
+            }
+            public synchronized ConsoleMessage.MessageLevel getMessageLevel() {
+                while (!mIsMessageLevelAvailable) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                    }
+                }
+                return mMessageLevel;
+            }
+        }
         startWebServer(false);
-        String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
-        mWebView.loadData("<html><body><img src=\"" + imgUrl + "\"/></body></html>",
-                "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-
-        AssetManager assets = getActivity().getAssets();
-        Bitmap b1 = BitmapFactory.decodeStream(assets.open(TestHtmlConstants.SMALL_IMG_URL));
-        b1 = b1.copy(Config.ARGB_8888, true);
-
-        Picture p = mWebView.capturePicture();
-        Bitmap b2 = Bitmap.createBitmap(p.getWidth(), p.getHeight(), Config.ARGB_8888);
-        p.draw(new Canvas(b2));
-        assertTrue(checkBitmapInsideAnother(b1, b2));
+        final ConsoleMessageWebChromeClient webChromeClient = new ConsoleMessageWebChromeClient();
+        final String crossOriginUrl = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.getSettings().setJavaScriptEnabled(true);
+                mWebView.setWebChromeClient(webChromeClient);
+                mWebView.loadData("<html><head></head><body onload=\"" +
+                        "document.title = " +
+                        "document.getElementById('frame').contentWindow.location.href;" +
+                        "\"><iframe id=\"frame\" src=\"" + crossOriginUrl + "\"></body></html>",
+                        "text/html", "UTF-8");
+            }
+        });
+        assertEquals(ConsoleMessage.MessageLevel.ERROR, webChromeClient.getMessageLevel());
     }
 
     @TestTargets({
@@ -938,32 +1142,50 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testLoadDataWithBaseUrl() throws Exception {
         assertNull(mWebView.getTitle());
         assertNull(mWebView.getUrl());
         String imgUrl = TestHtmlConstants.SMALL_IMG_URL; // relative
 
+        // Check that we can access relative URLs and that reported URL is supplied history URL.
         startWebServer(false);
         String baseUrl = mWebServer.getAssetUrl("foo.html");
-        String failUrl = "random";
+        String historyUrl = "random";
         mWebView.loadDataWithBaseURL(baseUrl,
                 "<html><body><img src=\"" + imgUrl + "\"/></body></html>",
-                "text/html", "UTF-8", failUrl);
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        // check that image was retrieved from the server
+                "text/html", "UTF-8", historyUrl);
+        waitForLoadComplete();
         assertTrue(mWebServer.getLastRequestUrl().endsWith(imgUrl));
-        // the fail URL is used for the history entry, even if the load succeeds
-        assertEquals(failUrl, mWebView.getUrl());
+        assertEquals(historyUrl, mWebView.getUrl());
 
+        // Check that reported URL is "about:blank" when supplied history URL
+        // is null.
         imgUrl = TestHtmlConstants.LARGE_IMG_URL;
         mWebView.loadDataWithBaseURL(baseUrl,
                 "<html><body><img src=\"" + imgUrl + "\"/></body></html>",
                 "text/html", "UTF-8", null);
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        // check that image was retrieved from the server
+        waitForLoadComplete();
         assertTrue(mWebServer.getLastRequestUrl().endsWith(imgUrl));
-        // no history item saved, URL is still the last one
         assertEquals("about:blank", mWebView.getUrl());
+
+        // Test that JavaScript can access content from the same origin as the base URL.
+        mWebView.getSettings().setJavaScriptEnabled(true);
+        final String crossOriginUrl = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        mWebView.loadDataWithBaseURL(baseUrl, "<html><head></head><body onload=\"" +
+                "document.title = document.getElementById('frame').contentWindow.location.href;" +
+                "\"><iframe id=\"frame\" src=\"" + crossOriginUrl + "\"></body></html>",
+                "text/html", "UTF-8", null);
+        waitForLoadComplete();
+        assertEquals(crossOriginUrl, mWebView.getTitle());
+
+        // Check that when the base URL uses the 'data' scheme, a 'data' scheme URL is used and the
+        // history URL is ignored.
+        mWebView.loadDataWithBaseURL("data:foo", "<html><body>bar</body></html>",
+                "text/html", "UTF-8", historyUrl);
+        waitForLoadComplete();
+        assertTrue(mWebView.getUrl().indexOf("data:text/html,") == 0);
+        assertTrue(mWebView.getUrl().indexOf("bar") > 0);
     }
 
     @TestTargetNew(
@@ -972,21 +1194,14 @@
         args = {String.class},
         notes = "Cannot check highlighting"
     )
-    public void testFindAll() throws Throwable {
-        getActivity().runOnUiThread(new Runnable() {
-            public void run() {
-                String p = "<p>Find all instances of find on the page and highlight them.</p>";
+    @UiThreadTest
+    public void testFindAll() {
+        String p = "<p>Find all instances of find on the page and highlight them.</p>";
 
-                mWebView.loadData("<html><body>" + p +"</body></html>", "text/html", "UTF-8");
-            }
-        });
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
+        waitForLoadComplete();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(2, mWebView.findAll("find"));
-            }
-        });
+        assertEquals(2, mWebView.findAll("find"));
     }
 
     @TestTargets({
@@ -1007,52 +1222,78 @@
         )
     })
     public void testFindNext() throws Throwable {
-        // Reset the scaling so that finding the next "all" text will require scrolling.
-        mWebView.setInitialScale(100);
+        final ScrollRunnable runnable = new ScrollRunnable();
 
-        DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
-        int dimension = Math.max(metrics.widthPixels, metrics.heightPixels);
-        // create a paragraph high enough to take up the entire screen
-        String p = "<p style=\"height:" + dimension + "px;\">" +
-                "Find all instances of a word on the page and highlight them.</p>";
+        final class StopScrollingDelayedCheck extends DelayedCheck {
+            private int mPreviousScrollY = -1;
+            @Override
+            protected boolean check() {
+                try {
+                    runTestOnUiThread(runnable);
+                } catch (Throwable t) {}
+                boolean hasStopped =
+                    (mPreviousScrollY == -1 ? false : (runnable.getScrollY() == mPreviousScrollY));
+                mPreviousScrollY = runnable.getScrollY();
+                return hasStopped;
+            }
+        }
 
-        mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        final class FindNextRunnable implements Runnable {
+            private boolean mForward;
+            FindNextRunnable(boolean forward) {
+                mForward = forward;
+            }
+            public void run() {
+                mWebView.findNext(mForward);
+            }
+        }
 
-        // highlight all the strings found
         runTestOnUiThread(new Runnable() {
             public void run() {
+                // Reset the scaling so that finding the next "all" text will require scrolling.
+                mWebView.setInitialScale(100);
+
+                DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
+                int dimension = Math.max(metrics.widthPixels, metrics.heightPixels);
+                // create a paragraph high enough to take up the entire screen
+                String p = "<p style=\"height:" + dimension + "px;\">" +
+                        "Find all instances of a word on the page and highlight them.</p>";
+
+                mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+
+                // highlight all the strings found
                 mWebView.findAll("all");
             }
         });
         getInstrumentation().waitForIdleSync();
-        int previousScrollY = mWebView.getScrollY();
 
-        // Can not use @UiThreadTest here as we need wait in other thread until the scroll in UI
-        // thread finishes
-        findNextOnUiThread(true);
-        delayedCheckStopScrolling();
-        // assert that the view scrolls and focuses "all" in the second page
-        assertTrue(mWebView.getScrollY() > previousScrollY);
-        previousScrollY = mWebView.getScrollY();
+        runTestOnUiThread(runnable);
+        int previousScrollY = runnable.getScrollY();
 
-        findNextOnUiThread(true);
-        delayedCheckStopScrolling();
-        // assert that the view scrolls and focuses "all" in the first page
-        assertTrue(mWebView.getScrollY() < previousScrollY);
-        previousScrollY = mWebView.getScrollY();
+        // Focus "all" in the second page and assert that the view scrolls.
+        runTestOnUiThread(new FindNextRunnable(true));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() > previousScrollY);
+        previousScrollY = runnable.getScrollY();
 
-        findNextOnUiThread(false);
-        delayedCheckStopScrolling();
-        // assert that the view scrolls and focuses "all" in the second page
-        assertTrue(mWebView.getScrollY() > previousScrollY);
-        previousScrollY = mWebView.getScrollY();
+        // Focus "all" in the first page and assert that the view scrolls.
+        runTestOnUiThread(new FindNextRunnable(true));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() < previousScrollY);
+        previousScrollY = runnable.getScrollY();
 
-        findNextOnUiThread(false);
-        delayedCheckStopScrolling();
-        // assert that the view scrolls and focuses "all" in the first page
-        assertTrue(mWebView.getScrollY() < previousScrollY);
-        previousScrollY = mWebView.getScrollY();
+        // Focus "all" in the second page and assert that the view scrolls.
+        runTestOnUiThread(new FindNextRunnable(false));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() > previousScrollY);
+        previousScrollY = runnable.getScrollY();
+
+        // Focus "all" in the first page and assert that the view scrolls.
+        runTestOnUiThread(new FindNextRunnable(false));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() < previousScrollY);
+        previousScrollY = runnable.getScrollY();
 
         // clear the result
         runTestOnUiThread(new Runnable() {
@@ -1063,14 +1304,13 @@
         getInstrumentation().waitForIdleSync();
 
         // can not scroll any more
-        findNextOnUiThread(false);
-        delayedCheckStopScrolling();
-        assertTrue(mWebView.getScrollY() == previousScrollY);
+        runTestOnUiThread(new FindNextRunnable(false));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() == previousScrollY);
 
-        findNextOnUiThread(true);
-        delayedCheckStopScrolling();
-
-        assertTrue(mWebView.getScrollY() == previousScrollY);
+        runTestOnUiThread(new FindNextRunnable(true));
+        new StopScrollingDelayedCheck().run();
+        assertTrue(runnable.getScrollY() == previousScrollY);
     }
 
     @TestTargetNew(
@@ -1078,20 +1318,46 @@
         method = "documentHasImages",
         args = {android.os.Message.class}
     )
-    public void testDocumentHasImages() throws Exception {
-        startWebServer(false);
-        String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
-        mWebView.loadData("<html><body><img src=\"" + imgUrl + "\"/></body></html>",
-                "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+    public void testDocumentHasImages() throws Exception, Throwable {
+        final class DocumentHasImageCheckHandler extends Handler {
+            private boolean mReceived;
+            private int mMsgArg1;
+            public DocumentHasImageCheckHandler(Looper looper) {
+                super(looper);
+            }
+            @Override
+            public void handleMessage(Message msg) {
+                synchronized(this) {
+                    mReceived = true;
+                    mMsgArg1 = msg.arg1;
+                }
+            }
+            public synchronized boolean hasCalledHandleMessage() {
+                return mReceived;
+            }
+            public synchronized int getMsgArg1() {
+                return mMsgArg1;
+            }
+        }
 
-        // create the handler in other thread
+        startWebServer(false);
+        final String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
+
+        // Create a handler on the UI thread.
         final DocumentHasImageCheckHandler handler =
             new DocumentHasImageCheckHandler(mWebView.getHandler().getLooper());
-        Message response = new Message();
-        response.setTarget(handler);
-        assertFalse(handler.hasCalledHandleMessage());
-        mWebView.documentHasImages(response);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadData("<html><body><img src=\"" + imgUrl + "\"/></body></html>",
+                        "text/html", "UTF-8");
+                waitForLoadComplete();
+                Message response = new Message();
+                response.setTarget(handler);
+                assertFalse(handler.hasCalledHandleMessage());
+                mWebView.documentHasImages(response);
+            }
+        });
         new DelayedCheck() {
             @Override
             protected boolean check() {
@@ -1114,38 +1380,90 @@
         )
     })
     public void testPageScroll() throws Throwable {
-        DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
-        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
-        String p = "<p style=\"height:" + dimension + "px;\">" +
-                "Scroll by half the size of the page.</p>";
-        mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-
-        assertTrue(pageDownOnUiThread(false));
-
-        // scroll to the bottom
-        while (pageDownOnUiThread(false)) {
-            // do nothing
+        final class PageUpRunnable implements Runnable {
+            private boolean mResult;
+            public void run() {
+                mResult = mWebView.pageUp(false);
+            }
+            public boolean getResult() {
+                return mResult;
+            }
         }
-        assertFalse(pageDownOnUiThread(false));
-        int bottomScrollY = mWebView.getScrollY();
 
-        assertTrue(pageUpOnUiThread(false));
-
-        // scroll to the top
-        while (pageUpOnUiThread(false)) {
-            // do nothing
+        final class PageDownRunnable implements Runnable {
+            private boolean mResult;
+            public void run() {
+                mResult = mWebView.pageDown(false);
+            }
+            public boolean getResult() {
+                return mResult;
+            }
         }
-        assertFalse(pageUpOnUiThread(false));
-        int topScrollY = mWebView.getScrollY();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
+                int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+                String p = "<p style=\"height:" + dimension + "px;\">" +
+                        "Scroll by half the size of the page.</p>";
+                mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertTrue(mWebView.pageDown(false));
+            }
+        });
+
+        PageDownRunnable pageDownRunnable = new PageDownRunnable();
+        do {
+            getInstrumentation().waitForIdleSync();
+            runTestOnUiThread(pageDownRunnable);
+        } while (pageDownRunnable.getResult());
+
+        ScrollRunnable scrollRunnable = new ScrollRunnable();
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(scrollRunnable);
+        int bottomScrollY = scrollRunnable.getScrollY();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertTrue(mWebView.pageUp(false));
+            }
+        });
+
+        PageUpRunnable pageUpRunnable = new PageUpRunnable();
+        do {
+            getInstrumentation().waitForIdleSync();
+            runTestOnUiThread(pageUpRunnable);
+        } while (pageUpRunnable.getResult());
+
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(scrollRunnable);
+        int topScrollY = scrollRunnable.getScrollY();
 
         // jump to the bottom
-        assertTrue(pageDownOnUiThread(true));
-        assertEquals(bottomScrollY, mWebView.getScrollY());
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertTrue(mWebView.pageDown(true));
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(scrollRunnable);
+        assertEquals(bottomScrollY, scrollRunnable.getScrollY());
 
         // jump to the top
-        assertTrue(pageUpOnUiThread(true));
-        assertEquals(topScrollY, mWebView.getScrollY());
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertTrue(mWebView.pageUp(true));
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(scrollRunnable);
+        assertEquals(topScrollY, scrollRunnable.getScrollY());
     }
 
     @TestTargetNew(
@@ -1153,60 +1471,57 @@
         method = "getContentHeight",
         args = {}
     )
-    public void testGetContentHeight() throws InterruptedException {
-        mWebView.loadData("<html><body></body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals(mWebView.getHeight(), mWebView.getContentHeight() * mWebView.getScale(), 2f);
+    public void testGetContentHeight() throws Throwable {
+        final class HeightRunnable implements Runnable {
+            private int mHeight;
+            private int mContentHeight;
+            public void run() {
+                mHeight = mWebView.getHeight();
+                mContentHeight = mWebView.getContentHeight();
+            }
+            public int getHeight() {
+                return mHeight;
+            }
+            public int getContentHeight() {
+                return mContentHeight;
+            }
+        }
 
-        final int pageHeight = 600;
-        // set the margin to 0
-        String p = "<p style=\"height:" + pageHeight + "px;margin:0px auto;\">Get the height of "
-                + "HTML content.</p>";
-        mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertTrue(mWebView.getContentHeight() > pageHeight);
-        int extraSpace = mWebView.getContentHeight() - pageHeight;
-
-        mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals(pageHeight + pageHeight + extraSpace, mWebView.getContentHeight());
-    }
-
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "Cannot test whether the view is cleared.",
-        method = "clearView",
-        args = {}
-    )
-    public void testClearView() throws Throwable {
-        startWebServer(false);
-        String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
-        mWebView.loadData("<html><body><img src=\"" + imgUrl + "\"/></body></html>",
-                "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-
-        AssetManager assets = getActivity().getAssets();
-        Bitmap b1 = BitmapFactory.decodeStream(assets.open(TestHtmlConstants.SMALL_IMG_URL));
-        b1 = b1.copy(Config.ARGB_8888, true);
-
-        Picture p = mWebView.capturePicture();
-        Bitmap b2 = Bitmap.createBitmap(p.getWidth(), p.getHeight(), Config.ARGB_8888);
-        p.draw(new Canvas(b2));
-        // the image is painted
-        assertTrue(checkBitmapInsideAnother(b1, b2));
-
-        mWebView.clearView();
         runTestOnUiThread(new Runnable() {
             public void run() {
-                mWebView.invalidate();
+                mWebView.loadData("<html><body></body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
             }
         });
         getInstrumentation().waitForIdleSync();
-        // Can not check whether method clearView() take effect by automatic testing:
-        // 1. Can not use getMeasuredHeight() and getMeasuredWidth() to
-        //    check that the onMeasure() returns 0
-        // 2. Can not use capturePicture() to check that the content has been cleared.
-        //    The result of capturePicture() is not updated after clearView() is called.
+
+        final int pageHeight = 600;
+        // set the margin to 0
+        final String p = "<p style=\"height:" + pageHeight
+                + "px;margin:0px auto;\">Get the height of HTML content.</p>";
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(mWebView.getHeight(), mWebView.getContentHeight() * mWebView.getScale(), 2f);
+                mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        HeightRunnable runnable = new HeightRunnable();
+        runTestOnUiThread(runnable);
+        assertTrue(runnable.getContentHeight() > pageHeight);
+        int extraSpace = runnable.getContentHeight() - pageHeight;
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(runnable);
+        assertEquals(pageHeight + pageHeight + extraSpace, runnable.getContentHeight());
     }
 
     @TestTargetNew(
@@ -1214,6 +1529,7 @@
         method = "clearCache",
         args = {boolean.class}
     )
+    @UiThreadTest
     public void testClearCache() throws Exception {
         final File cacheFileBaseDir = CacheManager.getCacheFileBaseDir();
         mWebView.clearCache(true);
@@ -1222,7 +1538,7 @@
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         mWebView.loadUrl(url);
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         new DelayedCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
@@ -1262,6 +1578,7 @@
             notes = "Cannot simulate data state or proxy changes"
         )
     })
+    @UiThreadTest
     public void testPlatformNotifications() {
         WebView.enablePlatformNotifications();
         WebView.disablePlatformNotifications();
@@ -1279,6 +1596,7 @@
             args = {boolean.class}
         )
     })
+    @UiThreadTest
     public void testAccessPluginList() {
         assertNotNull(WebView.getPluginList());
 
@@ -1291,6 +1609,7 @@
         method = "destroy",
         args = {}
     )
+    @UiThreadTest
     public void testDestroy() {
         // Create a new WebView, since we cannot call destroy() on a view in the hierarchy
         WebView localWebView = new WebView(getActivity());
@@ -1303,15 +1622,23 @@
         args = {int.class, int.class}
     )
     public void testFlingScroll() throws Throwable {
-        DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
-        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
-        String p = "<p style=\"height:" + dimension + "px;" +
-                "width:" + dimension + "px\">Test fling scroll.</p>";
-        mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
+                int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+                String p = "<p style=\"height:" + dimension + "px;" +
+                        "width:" + dimension + "px\">Test fling scroll.</p>";
+                mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
-        int previousScrollX = mWebView.getScrollX();
-        int previousScrollY = mWebView.getScrollY();
+        ScrollRunnable runnable = new ScrollRunnable();
+        runTestOnUiThread(runnable);
+        int previousScrollX = runnable.getScrollX();
+        int previousScrollY = runnable.getScrollY();
+
         runTestOnUiThread(new Runnable() {
             public void run() {
                 mWebView.flingScroll(100, 100);
@@ -1320,20 +1647,23 @@
 
         int timeSlice = 500;
         Thread.sleep(timeSlice);
-        assertTrue(mWebView.getScrollX() > previousScrollX);
-        assertTrue(mWebView.getScrollY() > previousScrollY);
+        runTestOnUiThread(runnable);
+        assertTrue(runnable.getScrollX() > previousScrollX);
+        assertTrue(runnable.getScrollY() > previousScrollY);
 
-        previousScrollY = mWebView.getScrollY();
-        previousScrollX = mWebView.getScrollX();
+        previousScrollY = runnable.getScrollY();
+        previousScrollX = runnable.getScrollX();
         Thread.sleep(timeSlice);
-        assertTrue(mWebView.getScrollX() >= previousScrollX);
-        assertTrue(mWebView.getScrollY() >= previousScrollY);
+        runTestOnUiThread(runnable);
+        assertTrue(runnable.getScrollX() >= previousScrollX);
+        assertTrue(runnable.getScrollY() >= previousScrollY);
 
-        previousScrollY = mWebView.getScrollY();
-        previousScrollX = mWebView.getScrollX();
+        previousScrollY = runnable.getScrollY();
+        previousScrollX = runnable.getScrollX();
         Thread.sleep(timeSlice);
-        assertTrue(mWebView.getScrollX() >= previousScrollX);
-        assertTrue(mWebView.getScrollY() >= previousScrollY);
+        runTestOnUiThread(runnable);
+        assertTrue(runnable.getScrollX() >= previousScrollX);
+        assertTrue(runnable.getScrollY() >= previousScrollY);
     }
 
     @TestTargetNew(
@@ -1341,21 +1671,30 @@
         method = "requestFocusNodeHref",
         args = {android.os.Message.class}
     )
-    public void testRequestFocusNodeHref() throws InterruptedException {
-        String links = "<DL><p><DT><A HREF=\"" + TestHtmlConstants.HTML_URL1
+    public void testRequestFocusNodeHref() throws Throwable {
+        final String links = "<DL><p><DT><A HREF=\"" + TestHtmlConstants.HTML_URL1
                 + "\">HTML_URL1</A><DT><A HREF=\"" + TestHtmlConstants.HTML_URL2
                 + "\">HTML_URL2</A></DL><p>";
-        mWebView.loadData("<html><body>" + links + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadData("<html><body>" + links + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
         final HrefCheckHandler handler = new HrefCheckHandler(mWebView.getHandler().getLooper());
-        Message hrefMsg = new Message();
+        final Message hrefMsg = new Message();
         hrefMsg.setTarget(handler);
 
         // focus on first link
         handler.reset();
         getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
-        mWebView.requestFocusNodeHref(hrefMsg);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.requestFocusNodeHref(hrefMsg);
+            }
+        });
         new DelayedCheck() {
             @Override
             protected boolean check() {
@@ -1366,10 +1705,14 @@
 
         // focus on second link
         handler.reset();
-        hrefMsg = new Message();
-        hrefMsg.setTarget(handler);
+        final Message hrefMsg2 = new Message();
+        hrefMsg2.setTarget(handler);
         getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
-        mWebView.requestFocusNodeHref(hrefMsg);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.requestFocusNodeHref(hrefMsg2);
+            }
+        });
         new DelayedCheck() {
             @Override
             protected boolean check() {
@@ -1378,7 +1721,11 @@
         }.run();
         assertEquals(TestHtmlConstants.HTML_URL2, handler.getResultUrl());
 
-        mWebView.requestFocusNodeHref(null);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.requestFocusNodeHref(null);
+            }
+        });
     }
 
     @TestTargetNew(
@@ -1386,32 +1733,54 @@
         method = "requestImageRef",
         args = {android.os.Message.class}
     )
-    public void testRequestImageRef() throws Exception {
+    public void testRequestImageRef() throws Exception, Throwable {
+        final class GetLocationRunnable implements Runnable {
+            private int[] mLocation;
+            public void run() {
+                mLocation = new int[2];
+                mWebView.getLocationOnScreen(mLocation);
+            }
+            public int[] getLocation() {
+                return mLocation;
+            }
+        }
+
         AssetManager assets = getActivity().getAssets();
         Bitmap bitmap = BitmapFactory.decodeStream(assets.open(TestHtmlConstants.LARGE_IMG_URL));
         int imgWidth = bitmap.getWidth();
         int imgHeight = bitmap.getHeight();
 
         startWebServer(false);
-        String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.LARGE_IMG_URL);
-        mWebView.loadData("<html><title>Title</title><body><img src=\"" + imgUrl
-                + "\"/></body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        final String imgUrl = mWebServer.getAssetUrl(TestHtmlConstants.LARGE_IMG_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadData("<html><title>Title</title><body><img src=\"" + imgUrl
+                        + "\"/></body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
         final HrefCheckHandler handler = new HrefCheckHandler(mWebView.getHandler().getLooper());
-        Message msg = new Message();
+        final Message msg = new Message();
         msg.setTarget(handler);
 
         // touch the image
         handler.reset();
-        int[] location = new int[2];
-        mWebView.getLocationOnScreen(location);
+        GetLocationRunnable runnable = new GetLocationRunnable();
+        runTestOnUiThread(runnable);
+        int[] location = runnable.getLocation();
+
         long time = SystemClock.uptimeMillis();
         getInstrumentation().sendPointerSync(
                 MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN,
                         location[0] + imgWidth / 2,
                         location[1] + imgHeight / 2, 0));
-        mWebView.requestImageRef(msg);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.requestImageRef(msg);
+            }
+        });
         new DelayedCheck() {
             @Override
             protected boolean check() {
@@ -1426,6 +1795,7 @@
         method = "debugDump",
         args = {}
     )
+    @UiThreadTest
     public void testDebugDump() {
         mWebView.debugDump();
     }
@@ -1436,62 +1806,79 @@
         args = {}
     )
     public void testGetHitTestResult() throws Throwable {
-        String anchor = "<p><a href=\"" + TestHtmlConstants.EXT_WEB_URL1
+        class HitTestResultRunnable implements Runnable {
+            private HitTestResult mHitTestResult;
+            public void run() {
+                mHitTestResult = mWebView.getHitTestResult();
+            }
+            public HitTestResult getHitTestResult() {
+                return mHitTestResult;
+            }
+        }
+
+        final String anchor = "<p><a href=\"" + TestHtmlConstants.EXT_WEB_URL1
                 + "\">normal anchor</a></p>";
-        String blankAnchor = "<p><a href=\"\">blank anchor</a></p>";
-        String form = "<p><form><input type=\"text\" name=\"Test\"><br>"
+        final String blankAnchor = "<p><a href=\"\">blank anchor</a></p>";
+        final String form = "<p><form><input type=\"text\" name=\"Test\"><br>"
                 + "<input type=\"submit\" value=\"Submit\"></form></p>";
         String phoneNo = "3106984000";
-        String tel = "<p><a href=\"tel:" + phoneNo + "\">Phone</a></p>";
+        final String tel = "<p><a href=\"tel:" + phoneNo + "\">Phone</a></p>";
         String email = "test@gmail.com";
-        String mailto = "<p><a href=\"mailto:" + email + "\">Email</a></p>";
+        final String mailto = "<p><a href=\"mailto:" + email + "\">Email</a></p>";
         String location = "shanghai";
-        String geo = "<p><a href=\"geo:0,0?q=" + location + "\">Location</a></p>";
-        mWebView.loadDataWithBaseURL("fake://home", "<html><body>" + anchor + blankAnchor + form
-                + tel + mailto + geo + "</body></html>", "text/html", "UTF-8", null);
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        final String geo = "<p><a href=\"geo:0,0?q=" + location + "\">Location</a></p>";
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadDataWithBaseURL("fake://home", "<html><body>" + anchor + blankAnchor + form
+                        + tel + mailto + geo + "</body></html>", "text/html", "UTF-8", null);
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        HitTestResultRunnable runnable = new HitTestResultRunnable();
 
         // anchor
         moveFocusDown();
-        HitTestResult result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, result.getType());
-        assertEquals(TestHtmlConstants.EXT_WEB_URL1, result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, runnable.getHitTestResult().getType());
+        assertEquals(TestHtmlConstants.EXT_WEB_URL1, runnable.getHitTestResult().getExtra());
 
         // blank anchor
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, result.getType());
-        assertEquals("fake://home", result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, runnable.getHitTestResult().getType());
+        assertEquals("fake://home", runnable.getHitTestResult().getExtra());
 
         // text field
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.EDIT_TEXT_TYPE, result.getType());
-        assertNull(result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.EDIT_TEXT_TYPE, runnable.getHitTestResult().getType());
+        assertNull(runnable.getHitTestResult().getExtra());
 
         // submit button
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.UNKNOWN_TYPE, result.getType());
-        assertNull(result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.UNKNOWN_TYPE, runnable.getHitTestResult().getType());
+        assertNull(runnable.getHitTestResult().getExtra());
 
         // phone number
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.PHONE_TYPE, result.getType());
-        assertEquals(phoneNo, result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.PHONE_TYPE, runnable.getHitTestResult().getType());
+        assertEquals(phoneNo, runnable.getHitTestResult().getExtra());
 
         // email
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.EMAIL_TYPE, result.getType());
-        assertEquals(email, result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.EMAIL_TYPE, runnable.getHitTestResult().getType());
+        assertEquals(email, runnable.getHitTestResult().getExtra());
 
         // geo address
         moveFocusDown();
-        result = mWebView.getHitTestResult();
-        assertEquals(HitTestResult.GEO_TYPE, result.getType());
-        assertEquals(location, result.getExtra());
+        runTestOnUiThread(runnable);
+        assertEquals(HitTestResult.GEO_TYPE, runnable.getHitTestResult().getType());
+        assertEquals(location, runnable.getHitTestResult().getExtra());
     }
 
     @TestTargetNew(
@@ -1499,29 +1886,58 @@
         method = "setInitialScale",
         args = {int.class}
     )
-    public void testSetInitialScale() throws InterruptedException {
-        String p = "<p style=\"height:1000px;width:1000px\">Test setInitialScale.</p>";
-        mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        final float defaultScale = getInstrumentation().getTargetContext().getResources().
-            getDisplayMetrics().density;
-        assertEquals(defaultScale, mWebView.getScale(), .01f);
+    public void testSetInitialScale() throws Throwable {
+        final String p = "<p style=\"height:1000px;width:1000px\">Test setInitialScale.</p>";
+        final float defaultScale =
+            getInstrumentation().getTargetContext().getResources().getDisplayMetrics().density;
 
-        mWebView.setInitialScale(0);
-        // modify content to fool WebKit into re-loading
-        mWebView.loadData("<html><body>" + p + "2" + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals(defaultScale, mWebView.getScale(), .01f);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
-        mWebView.setInitialScale(50);
-        mWebView.loadData("<html><body>" + p + "3" + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals(0.5f, mWebView.getScale(), .02f);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(defaultScale, mWebView.getScale(), .01f);
 
-        mWebView.setInitialScale(0);
-        mWebView.loadData("<html><body>" + p + "4" + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        assertEquals(defaultScale, mWebView.getScale(), .01f);
+                mWebView.setInitialScale(0);
+                // modify content to fool WebKit into re-loading
+                mWebView.loadData("<html><body>" + p + "2" + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(defaultScale, mWebView.getScale(), .01f);
+
+                mWebView.setInitialScale(50);
+                mWebView.loadData("<html><body>" + p + "3" + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(0.5f, mWebView.getScale(), .02f);
+
+                mWebView.setInitialScale(0);
+                mWebView.loadData("<html><body>" + p + "4" + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(defaultScale, mWebView.getScale(), .01f);
+            }
+        });
     }
 
     @TestTargetNew(
@@ -1531,10 +1947,11 @@
         args = {}
     )
     @ToBeFixed(explanation = "Favicon is not loaded automatically.")
+    @UiThreadTest
     public void testGetFavicon() throws Exception {
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.TEST_FAVICON_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        assertLoadUrlSuccessfully(url);
         mWebView.getFavicon();
         // ToBeFixed: Favicon is not loaded automatically.
         // assertNotNull(mWebView.getFavicon());
@@ -1545,19 +1962,20 @@
         method = "clearHistory",
         args = {}
     )
+    @UiThreadTest
     public void testClearHistory() throws Exception {
         startWebServer(false);
         String url1 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL1);
         String url2 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2);
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
-        assertLoadUrlSuccessfully(mWebView, url1);
+        assertLoadUrlSuccessfully(url1);
         delayedCheckWebBackForwardList(url1, 0, 1);
 
-        assertLoadUrlSuccessfully(mWebView, url2);
+        assertLoadUrlSuccessfully(url2);
         delayedCheckWebBackForwardList(url2, 1, 2);
 
-        assertLoadUrlSuccessfully(mWebView, url3);
+        assertLoadUrlSuccessfully(url3);
         delayedCheckWebBackForwardList(url3, 2, 3);
 
         mWebView.clearHistory();
@@ -1584,6 +2002,7 @@
         )
     })
     @ToBeFixed(explanation="Web history items do not get inflated after restore.")
+    @UiThreadTest
     public void testSaveAndRestoreState() throws Throwable {
         // nothing to save
         assertNull(mWebView.saveState(new Bundle()));
@@ -1594,11 +2013,11 @@
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
         // make a history list
-        assertLoadUrlSuccessfully(mWebView, url1);
+        assertLoadUrlSuccessfully(url1);
         delayedCheckWebBackForwardList(url1, 0, 1);
-        assertLoadUrlSuccessfully(mWebView, url2);
+        assertLoadUrlSuccessfully(url2);
         delayedCheckWebBackForwardList(url2, 1, 2);
-        assertLoadUrlSuccessfully(mWebView, url3);
+        assertLoadUrlSuccessfully(url3);
         delayedCheckWebBackForwardList(url3, 2, 3);
 
         // save the list
@@ -1653,10 +2072,27 @@
         args = {WebViewClient.class}
     )
     public void testSetWebViewClient() throws Throwable {
-        final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        final class MockWebViewClient extends WebViewClient {
+            private boolean mOnScaleChangedCalled = false;
+            @Override
+            public void onScaleChanged(WebView view, float oldScale, float newScale) {
+                super.onScaleChanged(view, oldScale, newScale);
+                mOnScaleChangedCalled = true;
+            }
+            public boolean onScaleChangedCalled() {
+                return mOnScaleChangedCalled;
+            }
+        }
 
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
         assertFalse(webViewClient.onScaleChangedCalled());
+
         runTestOnUiThread(new Runnable() {
             public void run() {
                 mWebView.zoomIn();
@@ -1679,31 +2115,50 @@
         )
     })
     public void testAccessCertificate() throws Throwable {
+        final class MockWebViewClient extends WebViewClient {
+            @Override
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+                handler.proceed();
+            }
+        }
+
+        final class LoadCompleteWebChromeClient extends WebChromeClient {
+            @Override
+            public void onProgressChanged(WebView webView, int progress) {
+                super.onProgressChanged(webView, progress);
+                if (progress == 100) {
+                    notifyUiThreadDone();
+                }
+            }
+        }
+
+        startWebServer(true);
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         runTestOnUiThread(new Runnable() {
             public void run() {
-                mWebView = new WebView(getActivity());
-                getActivity().setContentView(mWebView);
+                // need the client to handle error
+                mWebView.setWebViewClient(new MockWebViewClient());
+                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
+                mWebView.setCertificate(null);
+                // attempt to load the url.
+                mWebView.loadUrl(url);
             }
         });
-        getInstrumentation().waitForIdleSync();
+        waitForUiThreadDone();
 
-        // need the client to handle error
-        mWebView.setWebViewClient(new MockWebViewClient());
-
-        mWebView.setCertificate(null);
-        startWebServer(true);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        // attempt to load the url.
-        mWebView.loadUrl(url);
-        new DelayedCheck(TEST_TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return mWebView.getCertificate() != null;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                new DelayedCheck(TEST_TIMEOUT) {
+                    @Override
+                    protected boolean check() {
+                        return mWebView.getCertificate() != null;
+                    }
+                }.run();
+                SslCertificate cert = mWebView.getCertificate();
+                assertNotNull(cert);
+                assertEquals("Android", cert.getIssuedTo().getUName());
             }
-        }.run();
-        SslCertificate cert = mWebView.getCertificate();
-        assertNotNull(cert);
-        assertEquals("Android", cert.getIssuedTo().getUName());
+        });
     }
 
     @TestTargetNew(
@@ -1712,6 +2167,7 @@
         method = "clearSslPreferences",
         args = {}
     )
+    @UiThreadTest
     public void testClearSslPreferences() {
         mWebView.clearSslPreferences();
     }
@@ -1722,11 +2178,15 @@
         args = {View.class, Rect.class, boolean.class}
     )
     public void testRequestChildRectangleOnScreen() throws Throwable {
-        DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
-        final int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
-        String p = "<p style=\"height:" + dimension + "px;width:" + dimension + "px\">&nbsp;</p>";
-        mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
+                final int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+                String p = "<p style=\"height:" + dimension + "px;width:" + dimension + "px\">&nbsp;</p>";
+                mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", "UTF-8");
+                waitForLoadComplete();
+            }
+        });
         getInstrumentation().waitForIdleSync();
 
         runTestOnUiThread(new Runnable() {
@@ -1734,6 +2194,8 @@
                 int origX = mWebView.getScrollX();
                 int origY = mWebView.getScrollY();
 
+                DisplayMetrics metrics = mWebView.getContext().getResources().getDisplayMetrics();
+                final int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
                 int half = dimension / 2;
                 Rect rect = new Rect(half, half, half + 1, half + 1);
                 assertTrue(mWebView.requestChildRectangleOnScreen(mWebView, rect, true));
@@ -1757,20 +2219,37 @@
     })
     @ToBeFixed(explanation="Mime type and content length passed to listener are incorrect.")
     public void testSetDownloadListener() throws Throwable {
+        final class MyDownloadListener implements DownloadListener {
+            public String url;
+            public String mimeType;
+            public long contentLength;
+            public String contentDisposition;
+            public boolean called;
+
+            public void onDownloadStart(String url, String userAgent, String contentDisposition,
+                    String mimetype, long contentLength) {
+                this.called = true;
+                this.url = url;
+                this.mimeType = mimetype;
+                this.contentLength = contentLength;
+                this.contentDisposition = contentDisposition;
+            }
+        }
+
         final String mimeType = "application/octet-stream";
         final int length = 100;
         final MyDownloadListener listener = new MyDownloadListener();
 
         startWebServer(false);
-        String url = mWebServer.getBinaryUrl(mimeType, length);
-        mWebView.setWebViewClient(new WebViewClient());
-        mWebView.setDownloadListener(listener);
-        mWebView.loadData("<html><body><a href=\"" + url + "\">link</a></body></html>",
-                "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        // focus on the link
+        final String url = mWebServer.getBinaryUrl(mimeType, length);
+
         runTestOnUiThread(new Runnable() {
             public void run() {
+                mWebView.setWebViewClient(new WebViewClient());
+                mWebView.setDownloadListener(listener);
+                mWebView.loadData("<html><body><a href=\"" + url + "\">link</a></body></html>",
+                        "text/html", "UTF-8");
+                waitForLoadComplete();
                 assertTrue(mWebView.requestFocus(View.FOCUS_DOWN, null));
             }
         });
@@ -1808,6 +2287,7 @@
         method = "setMapTrackballToArrowKeys",
         args = {boolean.class}
     )
+    @UiThreadTest
     public void testSetMapTrackballToArrowKeys() {
         mWebView.setMapTrackballToArrowKeys(true);
     }
@@ -1817,22 +2297,23 @@
         method = "setNetworkAvailable",
         args = {boolean.class}
     )
+    @UiThreadTest
     public void testSetNetworkAvailable() throws Exception {
         WebSettings settings = mWebView.getSettings();
         settings.setJavaScriptEnabled(true);
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.NETWORK_STATE_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        assertLoadUrlSuccessfully(url);
         assertEquals("ONLINE", mWebView.getTitle());
 
         mWebView.setNetworkAvailable(false);
         mWebView.reload();
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("OFFLINE", mWebView.getTitle());
 
         mWebView.setNetworkAvailable(true);
         mWebView.reload();
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
+        waitForLoadComplete();
         assertEquals("ONLINE", mWebView.getTitle());
     }
 
@@ -1842,13 +2323,36 @@
         args = {WebChromeClient.class}
     )
     public void testSetWebChromeClient() throws Throwable {
-        final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        final class MockWebChromeClient extends WebChromeClient {
+            private boolean mOnProgressChanged = false;
+            @Override
+            public void onProgressChanged(WebView view, int newProgress) {
+                super.onProgressChanged(view, newProgress);
+                mOnProgressChanged = true;
+            }
+            public boolean onProgressChangedCalled() {
+                return mOnProgressChanged;
+            }
+        }
 
+        final MockWebChromeClient webChromeClient = new MockWebChromeClient();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.setWebChromeClient(webChromeClient);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
         assertFalse(webChromeClient.onProgressChangedCalled());
+
         startWebServer(false);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        mWebView.loadUrl(url);
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
 
         new DelayedCheck(TEST_TIMEOUT) {
             @Override
@@ -1955,44 +2459,11 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testInternals() {
         // Do not test these APIs. They are implementation details.
     }
 
-    private static class MockWebViewClient extends WebViewClient {
-        private boolean mOnScaleChangedCalled = false;
-
-        public boolean onScaleChangedCalled() {
-            return mOnScaleChangedCalled;
-        }
-
-        @Override
-        public void onScaleChanged(WebView view, float oldScale, float newScale) {
-            super.onScaleChanged(view, oldScale, newScale);
-            mOnScaleChangedCalled = true;
-        }
-
-        @Override
-        public void onReceivedSslError(WebView view, SslErrorHandler handler,
-                                       SslError error) {
-            handler.proceed();
-        }
-    }
-
-    private static class MockWebChromeClient extends WebChromeClient {
-        private boolean mOnProgressChanged = false;
-
-        public boolean onProgressChangedCalled() {
-            return mOnProgressChanged;
-        }
-
-        @Override
-        public void onProgressChanged(WebView view, int newProgress) {
-            super.onProgressChanged(view, newProgress);
-            mOnProgressChanged = true;
-        }
-    }
-
     private static class HrefCheckHandler extends Handler {
         private boolean mHadRecieved;
 
@@ -2022,44 +2493,6 @@
         }
     }
 
-    private static class DocumentHasImageCheckHandler extends Handler {
-        private boolean mReceived;
-
-        private int mMsgArg1;
-
-        public DocumentHasImageCheckHandler(Looper looper) {
-            super(looper);
-        }
-
-        public boolean hasCalledHandleMessage() {
-            return mReceived;
-        }
-
-        public int getMsgArg1() {
-            return mMsgArg1;
-        }
-
-        public void reset(){
-            mMsgArg1 = -1;
-            mReceived = false;
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            mReceived = true;
-            mMsgArg1 = msg.arg1;
-        }
-    };
-
-    private void findNextOnUiThread(final boolean forward) throws Throwable {
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.findNext(forward);
-            }
-        });
-        getInstrumentation().waitForIdleSync();
-    }
-
     private void moveFocusDown() throws Throwable {
         // send down key and wait for idle
         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
@@ -2067,60 +2500,22 @@
         Thread.sleep(500);
     }
 
-    private boolean pageDownOnUiThread(final boolean bottom) throws Throwable {
-        PageDownRunner runner = new PageDownRunner(bottom);
-        runTestOnUiThread(runner);
-        getInstrumentation().waitForIdleSync();
-        return runner.mResult;
-    }
-
-    private class PageDownRunner implements Runnable {
-        private boolean mResult, mBottom;
-
-        public PageDownRunner(boolean bottom) {
-            mBottom = bottom;
-        }
-
+    private final class ScrollRunnable implements Runnable {
+        private int mScrollX;
+        private int mScrollY;
+        @Override
         public void run() {
-            mResult = mWebView.pageDown(mBottom);
+            mScrollX = mWebView.getScrollX();
+            mScrollY = mWebView.getScrollY();
         }
-    }
-
-    private boolean pageUpOnUiThread(final boolean top) throws Throwable {
-        PageUpRunner runner = new PageUpRunner(top);
-        runTestOnUiThread(runner);
-        getInstrumentation().waitForIdleSync();
-        return runner.mResult;
-    }
-
-    private class PageUpRunner implements Runnable {
-        private boolean mResult, mTop;
-
-        public PageUpRunner(boolean top) {
-            this.mTop = top;
+        public int getScrollX() {
+            return mScrollX;
         }
-
-        public void run() {
-            mResult = mWebView.pageUp(mTop);
+        public int getScrollY() {
+            return mScrollY;
         }
     }
 
-    private void delayedCheckStopScrolling() {
-        new DelayedCheck() {
-            private int scrollY = mWebView.getScrollY();
-
-            @Override
-            protected boolean check() {
-                if (scrollY == mWebView.getScrollY()){
-                    return true;
-                } else {
-                    scrollY = mWebView.getScrollY();
-                    return false;
-                }
-            }
-        }.run();
-    }
-
     private void delayedCheckWebBackForwardList(final String currUrl, final int currIndex,
             final int size) {
         new DelayedCheck() {
@@ -2213,66 +2608,40 @@
         return true;
     }
 
-    private void assertLoadUrlSuccessfully(WebView webView, String url)
-            throws InterruptedException {
-        webView.loadUrl(url);
-        waitForLoadComplete(webView, TEST_TIMEOUT);
+    private void assertLoadUrlSuccessfully(String url) {
+        mWebView.loadUrl(url);
+        waitForLoadComplete();
     }
 
-    private void waitForLoadComplete(final WebView webView, long timeout)
-            throws InterruptedException {
-        new DelayedCheck(timeout) {
+    private void waitForLoadComplete() {
+        new DelayedCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
-                return webView.getProgress() == 100;
+                return mWebView.getProgress() == 100;
             }
         }.run();
-        Thread.sleep(TIME_FOR_LAYOUT);
-    }
-
-    private final class DummyJavaScriptInterface {
-        private boolean mTitleChanged;
-
-        private boolean hasChangedTitle() {
-            return mTitleChanged;
-        }
-
-        public void onLoad(String oldTitle) {
-            mWebView.getHandler().post(new Runnable() {
-                public void run() {
-                    mWebView.loadUrl("javascript:changeTitle(\"new title\")");
-                    mTitleChanged = true;
-                }
-            });
+        try {
+            Thread.sleep(TIME_FOR_LAYOUT);
+        } catch (InterruptedException e) {
+            Log.w(LOGTAG, "waitForLoadComplete() interrupted while sleeping for layout delay.");
         }
     }
 
-    private final class MyDownloadListener implements DownloadListener {
-        public String url;
-        public String mimeType;
-        public long contentLength;
-        public String contentDisposition;
-        public boolean called;
-
-        public void onDownloadStart(String url, String userAgent, String contentDisposition,
-                String mimetype, long contentLength) {
-            this.called = true;
-            this.url = url;
-            this.mimeType = mimetype;
-            this.contentLength = contentLength;
-            this.contentDisposition = contentDisposition;
-        }
+    private synchronized void notifyUiThreadDone() {
+        mIsUiThreadDone = true;
+        notify();
     }
 
-    private static class MyPictureListener implements PictureListener {
-        public int callCount;
-        public WebView webView;
-        public Picture picture;
-
-        public void onNewPicture(WebView view, Picture picture) {
-            this.callCount += 1;
-            this.webView = view;
-            this.picture = picture;
+    private synchronized void waitForUiThreadDone() throws InterruptedException {
+        while (!mIsUiThreadDone) {
+            try {
+                wait(TEST_TIMEOUT);
+            } catch (InterruptedException e) {
+                continue;
+            }
+            if (!mIsUiThreadDone) {
+                Assert.fail("Unexpected timeout");
+            }
         }
     }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebView_HitTestResultTest.java b/tests/tests/webkit/src/android/webkit/cts/WebView_HitTestResultTest.java
deleted file mode 100644
index 3d6f124..0000000
--- a/tests/tests/webkit/src/android/webkit/cts/WebView_HitTestResultTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-package android.webkit.cts;
-
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.view.KeyEvent;
-import android.view.animation.cts.DelayedCheck;
-import android.webkit.WebView;
-import android.webkit.WebView.HitTestResult;
-
-@TestTargetClass(HitTestResult.class)
-public class WebView_HitTestResultTest
-        extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
-    private static long TEST_TIMEOUT = 5000L;
-    private static long TIME_FOR_LAYOUT = 1000L;
-
-    public WebView_HitTestResultTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
-    }
-
-    private void waitForLoading(final WebView webView, long timeout) throws InterruptedException {
-        new DelayedCheck(timeout) {
-            @Override
-            protected boolean check() {
-                return webView.getProgress() == 100;
-            }
-        }.run();
-        Thread.sleep(TIME_FOR_LAYOUT);
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExtra",
-            args = {}
-        )
-    })
-    public void testHitTestResult() throws InterruptedException {
-        WebView webView = getActivity().getWebView();
-        String anchor = "<p><a href=\"" + TestHtmlConstants.EXT_WEB_URL1
-                + "\">normal anchor</a></p>";
-        webView.loadDataWithBaseURL("fake://home", "<html><body>" + anchor
-                + "</body></html>", "text/html", "UTF-8", null);
-        waitForLoading(webView, TEST_TIMEOUT);
-
-        // anchor
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        // extra sleep to make sure key has been fully handled
-        Thread.sleep(500);
-        HitTestResult result = webView.getHitTestResult();
-        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, result.getType());
-        assertEquals(TestHtmlConstants.EXT_WEB_URL1, result.getExtra());
-    }
-}
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index 335c406..f6a1aa7 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -128,29 +128,17 @@
 
         new PopupWindow(mActivity, null, com.android.internal.R.attr.popupWindowStyle);
 
-        try {
-            mPopupWindow = new PopupWindow();
-            assertEquals(0, mPopupWindow.getWidth());
-            assertEquals(0, mPopupWindow.getHeight());
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
-        }
+        mPopupWindow = new PopupWindow();
+        assertEquals(0, mPopupWindow.getWidth());
+        assertEquals(0, mPopupWindow.getHeight());
 
-        try {
-            mPopupWindow = new PopupWindow(50, 50);
-            assertEquals(50, mPopupWindow.getWidth());
-            assertEquals(50, mPopupWindow.getHeight());
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
-        }
+        mPopupWindow = new PopupWindow(50, 50);
+        assertEquals(50, mPopupWindow.getWidth());
+        assertEquals(50, mPopupWindow.getHeight());
 
-        try {
-            mPopupWindow = new PopupWindow(-1, -1);
-            assertEquals(-1, mPopupWindow.getWidth());
-            assertEquals(-1, mPopupWindow.getHeight());
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
-        }
+        mPopupWindow = new PopupWindow(-1, -1);
+        assertEquals(-1, mPopupWindow.getWidth());
+        assertEquals(-1, mPopupWindow.getHeight());
 
         TextView contentView = new TextView(mActivity);
         mPopupWindow = new PopupWindow(contentView);
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 71b2dba..166eb81 100755
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -44,7 +44,6 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Debug;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
 import android.test.UiThreadTest;
@@ -358,10 +357,10 @@
         mActivity.setContentView(R.layout.textview_gravity);
 
         mTextView = findTextView(R.id.gravity_default);
-        assertEquals(Gravity.TOP | Gravity.LEFT, mTextView.getGravity());
+        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
 
         mTextView = findTextView(R.id.gravity_bottom);
-        assertEquals(Gravity.BOTTOM | Gravity.LEFT, mTextView.getGravity());
+        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
 
         mTextView = findTextView(R.id.gravity_right);
         assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
@@ -383,13 +382,13 @@
         assertEquals(Gravity.CENTER, mTextView.getGravity());
 
         mTextView.setGravity(Gravity.NO_GRAVITY);
-        assertEquals(Gravity.TOP | Gravity.LEFT, mTextView.getGravity());
+        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
 
         mTextView.setGravity(Gravity.RIGHT);
         assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
 
         mTextView.setGravity(Gravity.FILL_VERTICAL);
-        assertEquals(Gravity.FILL_VERTICAL | Gravity.LEFT, mTextView.getGravity());
+        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
 
         //test negative input value.
         mTextView.setGravity(-1);
diff --git a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
index c8c03fd..98e807e 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
@@ -23,6 +23,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase;
+import android.test.UiThreadTest;
 import android.util.AttributeSet;
 import android.util.Xml;
 import android.view.View;
@@ -113,6 +114,7 @@
             args = {}
         )
     })
+    @UiThreadTest
     public void testViewFlipper() {
         ViewFlipper viewFlipper = (ViewFlipper) mActivity.findViewById(R.id.viewflipper_test);
 
diff --git a/tests/vm-tests-tf/AndroidManifest.xml b/tests/vm-tests-tf/AndroidManifest.xml
new file mode 100644
index 0000000..17e4c6c
--- /dev/null
+++ b/tests/vm-tests-tf/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.vm-tests-tf">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCoreTestRunner"
+                     android:targetPackage="android.core.vm-tests-tf"
+                     android:label="cts trade federeation vm tests"/>
+
+</manifest>
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
index d6a218e..2923ba2 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
@@ -58,6 +58,7 @@
         System.out.println("  -o FILE              output file or standard out if not given");
         System.out.println("  -f [txt|xml|html]    format of output");
         System.out.println("  -d PATH              path to dexdeps or expected to be in $PATH");
+        System.out.println("  -a PATH              path to the API XML file");
         System.out.println();
         System.exit(1);
     }
@@ -67,6 +68,7 @@
         File outputFile = null;
         int format = FORMAT_TXT;
         String dexDeps = "dexDeps";
+        String apiXmlPath = "";
 
         for (int i = 0; i < args.length; i++) {
             if (args[i].startsWith("-")) {
@@ -85,6 +87,8 @@
                     }
                 } else if ("-d".equals(args[i])) {
                     dexDeps = getExpectedArg(args, ++i);
+                } else if ("-a".equals(args[i])) {
+                    apiXmlPath = getExpectedArg(args, ++i);
                 } else {
                     printUsage();
                 }
@@ -104,7 +108,7 @@
          * 3. Output a report based on the coverage stats in the ApiCoverage object.
          */
 
-        ApiCoverage apiCoverage = getEmptyApiCoverage();
+        ApiCoverage apiCoverage = getEmptyApiCoverage(apiXmlPath);
         for (File testApk : testApks) {
             addApiCoverage(apiCoverage, testApk, dexDeps);
         }
@@ -125,16 +129,17 @@
      * Creates an object representing the API that will be used later to collect coverage
      * statistics as we iterate over the test APKs.
      *
+     * @param apiXmlPath to the API XML file
      * @return an {@link ApiCoverage} object representing the API in current.xml without any
      *     coverage statistics yet
      */
-    private static ApiCoverage getEmptyApiCoverage()
+    private static ApiCoverage getEmptyApiCoverage(String apiXmlPath)
             throws SAXException, IOException {
         XMLReader xmlReader = XMLReaderFactory.createXMLReader();
         CurrentXmlHandler currentXmlHandler = new CurrentXmlHandler();
         xmlReader.setContentHandler(currentXmlHandler);
 
-        File currentXml = new File("frameworks/base/api/current.xml");
+        File currentXml = new File(apiXmlPath);
         FileReader fileReader = null;
         try {
             fileReader = new FileReader(currentXml);
diff --git a/tools/dasm/src/dasm/DAsm.java b/tools/dasm/src/dasm/DAsm.java
index 2b58705..d298689 100644
--- a/tools/dasm/src/dasm/DAsm.java
+++ b/tools/dasm/src/dasm/DAsm.java
@@ -16,6 +16,7 @@
 
 package dasm;
 
+import com.android.dx.dex.DexOptions;
 import com.android.dx.dex.code.ArrayData;
 import com.android.dx.dex.code.CodeAddress;
 import com.android.dx.dex.code.CstInsn;
@@ -51,7 +52,6 @@
 import com.android.dx.rop.cst.CstShort;
 import com.android.dx.rop.cst.CstString;
 import com.android.dx.rop.cst.CstType;
-import com.android.dx.rop.cst.CstUtf8;
 import com.android.dx.rop.type.StdTypeList;
 import com.android.dx.rop.type.Type;
 import com.android.dx.rop.type.TypeList;
@@ -82,6 +82,9 @@
     // number of errors reported in a file.
     int errors;
 
+    // options for dex output
+    DexOptions dexOptions = new DexOptions();
+
     // file being processed
     DexFile dexFile;
     int line_num;
@@ -143,7 +146,7 @@
      * output_finisher.
      */
     int current_insn_number;
-    Hashtable<Integer, CodeAddress> unprocessed_relative_goto_addr = 
+    Hashtable<Integer, CodeAddress> unprocessed_relative_goto_addr =
             new Hashtable<Integer, CodeAddress>();
 
     // fill-array-data data
@@ -325,7 +328,7 @@
                 .internClassName(class_name)), class_acc,
                 superclass_name != null ? CstType.intern(Type
                         .internClassName(superclass_name)) : null, tl,
-                new CstUtf8(source_name));
+                new CstString(source_name));
         dexFile.add(classDef);
         class_header = false;
     }
@@ -363,7 +366,7 @@
                     + ", " + access + ", "
                     + (value == null ? "null" : value.toString()) + ")");
 
-        CstNat nat = new CstNat(new CstUtf8(name), new CstUtf8(desc));
+        CstNat nat = new CstNat(new CstString(name), new CstString(desc));
         CstFieldRef field = new CstFieldRef(classDef.getThisClass(), nat);
         EncodedField ef = new EncodedField(field, access);
         if ((access & AccessFlags.ACC_STATIC) != 0) {
@@ -399,7 +402,7 @@
         current_insn_number = 0;
         regs_count = 1;
 
-        method_nat = new CstNat(new CstUtf8(name), new CstUtf8(descriptor));
+        method_nat = new CstNat(new CstString(name), new CstString(descriptor));
         if (method_nat.isClassInit()) access |= AccessFlags.ACC_STATIC;
         if (method_nat.isInstanceInit()) access |= AccessFlags.ACC_CONSTRUCTOR;
 
@@ -674,7 +677,7 @@
                         + v1 + ")");
             }
             RegisterSpec reg1_spec = RegisterSpec.make(reg1_num, Type.STRING);
-            Constant constant = new CstString(new CstUtf8(v2));
+            Constant constant = new CstString(v2);
             DalvInsn dalvInsn = new CstInsn(insn.opcode,
                     createSourcePosition(), RegisterSpecList.make(reg1_spec),
                     constant);
@@ -744,8 +747,8 @@
             } else {
                 // invoke-kind
                 String[] names = Utils.getClassMethodSignatureFromString(v2);
-                CstNat method_nat = new CstNat(new CstUtf8(names[1]),
-                        new CstUtf8(names[2]));
+                CstNat method_nat = new CstNat(new CstString(names[1]),
+                        new CstString(names[2]));
 
                 /*
                  * if(insn.args.compareToIgnoreCase(
@@ -818,8 +821,8 @@
             } else {
                 // invoke-kind/range
                 String[] names = Utils.getClassMethodSignatureFromString(v2);
-                CstNat method_nat = new CstNat(new CstUtf8(names[1]),
-                        new CstUtf8(names[2]));
+                CstNat method_nat = new CstNat(new CstString(names[1]),
+                        new CstString(names[2]));
 
                 /*
                  * if(insn.args.compareToIgnoreCase(
@@ -918,7 +921,7 @@
                 reg1_spec = RegisterSpec.make(reg1_num, Type.FLOAT);
                 constant = CstFloat.make(Float.floatToIntBits(v2.floatValue()));
             } else if (v2 instanceof Double
-                    || (v2 instanceof Float && 
+                    || (v2 instanceof Float &&
                             insn.opcode.getFormat() == Form51l.THE_ONE)) {
                 reg1_spec = RegisterSpec.make(reg1_num, Type.DOUBLE);
                 constant = CstDouble.make(Double.doubleToLongBits(v2
@@ -1029,8 +1032,8 @@
 
             String[] names = Utils.getClassFieldFromString(v2);
 
-            CstNat field_nat = new CstNat(new CstUtf8(names[1]),
-                    new CstUtf8(v3));
+            CstNat field_nat = new CstNat(new CstString(names[1]),
+                    new CstString(v3));
 
             Constant constant = new CstFieldRef(CstType.intern(Type
                     .internClassName(names[0])), field_nat);
@@ -1101,8 +1104,8 @@
 
             String[] names = Utils.getClassFieldFromString(v3);
 
-            CstNat field_nat = new CstNat(new CstUtf8(names[1]),
-                    new CstUtf8(v4));
+            CstNat field_nat = new CstNat(new CstString(names[1]),
+                    new CstString(v4));
 
             Constant constant = new CstFieldRef(CstType.intern(Type
                     .internClassName(names[0])), field_nat);
@@ -1491,7 +1494,7 @@
      * Creates instance of SourcePosition for current line
      */
     protected SourcePosition createSourcePosition() {
-        return new SourcePosition(new CstUtf8(filename), -1, line_num);
+        return new SourcePosition(new CstString(filename), -1, line_num);
     }
 
     /**
@@ -1517,7 +1520,7 @@
      */
     private void createOutputFinisher() {
         if (output_finisher == null)
-            output_finisher = new OutputFinisher(5, regs_count);
+            output_finisher = new OutputFinisher(dexOptions, 5, regs_count);
     }
 
     /**
@@ -1576,7 +1579,7 @@
      * Parses a .d file, converting it internally into a binary representation.
      * If something goes wrong, this throws one of an IOException, or a
      * dasmError, or one of a few other exceptions.
-     * 
+     *
      * @param input
      *            is the stream containing the Dalvik assembly code for the
      *            class.
@@ -1597,7 +1600,7 @@
         source_name = name;
         class_header = false;
         classDef = null;
-        dexFile = new DexFile();
+        dexFile = new DexFile(dexOptions);
 
         scanner = new Scanner(input);
         parser parse_obj = new parser(this, scanner);
diff --git a/tools/dasm/src/dasm/DopInfo.java b/tools/dasm/src/dasm/DopInfo.java
index 8939399..c6a0aa7 100644
--- a/tools/dasm/src/dasm/DopInfo.java
+++ b/tools/dasm/src/dasm/DopInfo.java
@@ -16,7 +16,6 @@
 
 package dasm;
 
-import com.android.dx.dex.code.DalvOps;
 import com.android.dx.dex.code.Dop;
 import com.android.dx.dex.code.Dops;
 import com.android.dx.dex.code.InsnFormat;
@@ -44,6 +43,7 @@
 import com.android.dx.dex.code.form.Form35c;
 import com.android.dx.dex.code.form.Form3rc;
 import com.android.dx.dex.code.form.Form51l;
+import com.android.dx.io.Opcodes;
 
 import java.util.Hashtable;
 
@@ -135,24 +135,24 @@
         if (format instanceof Form21h) return ARG_REG_LITERAL;
         if (format instanceof Form21c) {
             switch (dop.getOpcode()) {
-            case DalvOps.CONST_CLASS:
-            case DalvOps.CHECK_CAST:
-            case DalvOps.NEW_INSTANCE:
+            case Opcodes.CONST_CLASS:
+            case Opcodes.CHECK_CAST:
+            case Opcodes.NEW_INSTANCE:
                 return ARG_REG_TYPE;
-            case DalvOps.SGET:
-            case DalvOps.SGET_WIDE:
-            case DalvOps.SGET_OBJECT:
-            case DalvOps.SGET_BOOLEAN:
-            case DalvOps.SGET_BYTE:
-            case DalvOps.SGET_CHAR:
-            case DalvOps.SGET_SHORT:
-            case DalvOps.SPUT:
-            case DalvOps.SPUT_WIDE:
-            case DalvOps.SPUT_OBJECT:
-            case DalvOps.SPUT_BOOLEAN:
-            case DalvOps.SPUT_BYTE:
-            case DalvOps.SPUT_CHAR:
-            case DalvOps.SPUT_SHORT:
+            case Opcodes.SGET:
+            case Opcodes.SGET_WIDE:
+            case Opcodes.SGET_OBJECT:
+            case Opcodes.SGET_BOOLEAN:
+            case Opcodes.SGET_BYTE:
+            case Opcodes.SGET_CHAR:
+            case Opcodes.SGET_SHORT:
+            case Opcodes.SPUT:
+            case Opcodes.SPUT_WIDE:
+            case Opcodes.SPUT_OBJECT:
+            case Opcodes.SPUT_BOOLEAN:
+            case Opcodes.SPUT_BYTE:
+            case Opcodes.SPUT_CHAR:
+            case Opcodes.SPUT_SHORT:
                 return ARG_REG_FIELD;
             default:
                 return ARG_REG_STRING;
@@ -164,23 +164,23 @@
         if (format instanceof Form22s) return ARG_REG_REG_LITERAL;
         if (format instanceof Form22c) {
             switch (dop.getOpcode()) {
-            case DalvOps.INSTANCE_OF:
-            case DalvOps.NEW_ARRAY:
+            case Opcodes.INSTANCE_OF:
+            case Opcodes.NEW_ARRAY:
                 return ARG_REG_REG_TYPE;
-            case DalvOps.IGET:
-            case DalvOps.IGET_WIDE:
-            case DalvOps.IGET_OBJECT:
-            case DalvOps.IGET_BOOLEAN:
-            case DalvOps.IGET_BYTE:
-            case DalvOps.IGET_CHAR:
-            case DalvOps.IGET_SHORT:
-            case DalvOps.IPUT:
-            case DalvOps.IPUT_WIDE:
-            case DalvOps.IPUT_OBJECT:
-            case DalvOps.IPUT_BOOLEAN:
-            case DalvOps.IPUT_BYTE:
-            case DalvOps.IPUT_CHAR:
-            case DalvOps.IPUT_SHORT:
+            case Opcodes.IGET:
+            case Opcodes.IGET_WIDE:
+            case Opcodes.IGET_OBJECT:
+            case Opcodes.IGET_BOOLEAN:
+            case Opcodes.IGET_BYTE:
+            case Opcodes.IGET_CHAR:
+            case Opcodes.IGET_SHORT:
+            case Opcodes.IPUT:
+            case Opcodes.IPUT_WIDE:
+            case Opcodes.IPUT_OBJECT:
+            case Opcodes.IPUT_BOOLEAN:
+            case Opcodes.IPUT_BYTE:
+            case Opcodes.IPUT_CHAR:
+            case Opcodes.IPUT_SHORT:
                 return ARG_REG_REG_FIELD;
             default:
                 return ARG_REG_REG_STRING;
@@ -193,12 +193,12 @@
         if (format instanceof Form31c) return ARG_REG_STRING;
         if (format instanceof Form35c) {
             switch (dop.getOpcode()) {
-            case DalvOps.INVOKE_VIRTUAL:
-            case DalvOps.INVOKE_SUPER:
-            case DalvOps.INVOKE_DIRECT:
-            case DalvOps.INVOKE_STATIC:
+            case Opcodes.INVOKE_VIRTUAL:
+            case Opcodes.INVOKE_SUPER:
+            case Opcodes.INVOKE_DIRECT:
+            case Opcodes.INVOKE_STATIC:
                 return ARG_REGLIST_METHOD;
-            case DalvOps.INVOKE_INTERFACE:
+            case Opcodes.INVOKE_INTERFACE:
                 return ARG_REGLIST_INTFMETHOD;
             default:
                 return ARG_REGLIST_TYPE;
@@ -206,9 +206,9 @@
         }
         if (format instanceof Form3rc) {
             switch (dop.getOpcode()) {
-            case DalvOps.FILLED_NEW_ARRAY_RANGE:
+            case Opcodes.FILLED_NEW_ARRAY_RANGE:
                 return ARG_REGRANGE_TYPE;
-            case DalvOps.INVOKE_INTERFACE_RANGE:
+            case Opcodes.INVOKE_INTERFACE_RANGE:
                 return ARG_REGRANGE_INTFMETHOD;
             default:
                 return ARG_REGRANGE_METHOD;
@@ -228,7 +228,7 @@
     static {
         dopsTable = new Hashtable<String, DopInfo>();
 
-        for (int i = 0; i < DalvOps.MAX_VALUE - DalvOps.MIN_VALUE + 1; i++) {
+        for (int i = 0; i < Opcodes.MAX_VALUE - Opcodes.MIN_VALUE + 1; i++) {
             try {
                 Dop dop = Dops.get(i);
                 add(dop.getName(), dop, getArgsFormat(dop));
diff --git a/tools/dx-tests/etc/compileall b/tools/dx-tests/etc/compileall
index cb95b4e..57bcec6 100755
--- a/tools/dx-tests/etc/compileall
+++ b/tools/dx-tests/etc/compileall
@@ -71,8 +71,8 @@
 else
     echo "tmp/intermediates dir (rel): $tmpdir"
 fi
-rm -rf --preserve-root $javac_out
-rm -rf --preserve-root $javafiles
+rm -rf $javac_out
+rm -rf $javafiles
 
 # compile all files from javafiles
 echo "compiling all java files (with package dxc.junit.**)"
diff --git a/tools/dx-tests/etc/starttests b/tools/dx-tests/etc/starttests
index afa55a8..b062fe7 100755
--- a/tools/dx-tests/etc/starttests
+++ b/tools/dx-tests/etc/starttests
@@ -59,7 +59,7 @@
 fi
 
 datadir=/tmp/${USER}
-rm -rf --preserve-root $datadir/dalvik-cache
+rm -rf $datadir/dalvik-cache
 mkdir -p $datadir
 mkdir -p $datadir/dalvik-cache
 
@@ -209,7 +209,7 @@
         (( jallcnt += 1 ))   
     
     
-        rm -rf --preserve-root $dxtmpdir/*
+        rm -rf $dxtmpdir/*
         mkdir -p $dxtmpdir
         cd $dxtmpdir            
         
diff --git a/tools/host/src/com/android/cts/CTSCommand.java b/tools/host/src/com/android/cts/CTSCommand.java
index 7755f5c..a1a2222 100644
--- a/tools/host/src/com/android/cts/CTSCommand.java
+++ b/tools/host/src/com/android/cts/CTSCommand.java
@@ -45,4 +45,5 @@
     static final String OPTION_SESSION = "--session";
     static final String OPTION_CFG = "--config";
     static final String OPTION_DERIVED_PLAN = "--derivedplan";
+    static final String OPTION_QUICK = "-q";
 }
diff --git a/tools/host/src/com/android/cts/CommandParser.java b/tools/host/src/com/android/cts/CommandParser.java
index 74c3280..85f8c2c 100644
--- a/tools/host/src/com/android/cts/CommandParser.java
+++ b/tools/host/src/com/android/cts/CommandParser.java
@@ -54,7 +54,8 @@
     private static Set<String> sOptionsSet = new HashSet<String>(Arrays.asList(
             CTSCommand.OPTION_CFG, CTSCommand.OPTION_PACKAGE, CTSCommand.OPTION_PLAN,
             CTSCommand.OPTION_DEVICE, CTSCommand.OPTION_RESULT, CTSCommand.OPTION_E,
-            CTSCommand.OPTION_SESSION, CTSCommand.OPTION_TEST, CTSCommand.OPTION_DERIVED_PLAN));
+            CTSCommand.OPTION_SESSION, CTSCommand.OPTION_TEST, CTSCommand.OPTION_DERIVED_PLAN,
+            CTSCommand.OPTION_QUICK));
     private static HashMap<String, String> sOptionMap = new HashMap<String, String>();
     static {
         final String[] keys = new String[] {
@@ -71,7 +72,8 @@
                 CTSCommand.OPTION_SESSION,
                 CTSCommand.OPTION_T,
                 CTSCommand.OPTION_TEST,
-                CTSCommand.OPTION_DERIVED_PLAN};
+                CTSCommand.OPTION_DERIVED_PLAN,
+                CTSCommand.OPTION_QUICK};
 
         final String[] values = new String[] {
                 CTSCommand.OPTION_CFG,
@@ -87,7 +89,8 @@
                 CTSCommand.OPTION_SESSION,
                 CTSCommand.OPTION_TEST,
                 CTSCommand.OPTION_TEST,
-                CTSCommand.OPTION_DERIVED_PLAN};
+                CTSCommand.OPTION_DERIVED_PLAN,
+                CTSCommand.OPTION_QUICK};
 
         for (int i = 0; i < keys.length; i++) {
             sOptionMap.put(keys[i], values[i]);
diff --git a/tools/host/src/com/android/cts/HostConfig.java b/tools/host/src/com/android/cts/HostConfig.java
index fbea3a5..d42dcf4 100644
--- a/tools/host/src/com/android/cts/HostConfig.java
+++ b/tools/host/src/com/android/cts/HostConfig.java
@@ -230,9 +230,9 @@
     }
 
     /**
-     * Get the test package by the JAVA package name of the test package.
+     * Get the test package by the name of the test package.
      *
-     * @param packageName The JAVA package name.
+     * @param packageName The package name.
      * @return The test package.
      */
     public TestPackage getTestPackage(final String packageName) {
@@ -242,9 +242,11 @@
     /**
      * Load repositories.
      */
-    public void loadRepositories() throws NoSuchAlgorithmException {
+    public void loadRepositories(boolean quick) throws NoSuchAlgorithmException {
         loadTestPackages();
-        loadTestResults();
+        if (!quick) {
+            loadTestResults();
+        }
     }
 
     /**
@@ -273,7 +275,7 @@
     /**
      * Get the package binary name.
      *
-     * @param appPackageName The JAVA package name.
+     * @param appPackageName The package name.
      * @return The binary name of the package.
      */
     public String getPackageBinaryName(String appPackageName) {
@@ -529,7 +531,7 @@
                 }
             }
         }
-     }
+    }
 
     /**
      * Storing the information of case repository.
@@ -542,7 +544,7 @@
         /**
          * Get package names.
          *
-         * @return The JAVA package names.
+         * @return The package names.
          */
         public ArrayList<String> getPackageNames() {
             ArrayList<String> packageNames = new ArrayList<String>();
diff --git a/tools/host/src/com/android/cts/HostSideOnlyPackage.java b/tools/host/src/com/android/cts/HostSideOnlyPackage.java
index 0dab280..7ed31d5 100644
--- a/tools/host/src/com/android/cts/HostSideOnlyPackage.java
+++ b/tools/host/src/com/android/cts/HostSideOnlyPackage.java
@@ -36,7 +36,7 @@
             final String androidVersion, final String jarPath,
             final String appPackageName) {
         super(null, testPkgBinaryName, null, null, version,
-                androidVersion, jarPath, null, appPackageName);
+                androidVersion, jarPath, null, appPackageName, null);
     }
 
     /** {@inheritDoc} */
diff --git a/tools/host/src/com/android/cts/ReferenceAppTestPackage.java b/tools/host/src/com/android/cts/ReferenceAppTestPackage.java
index 0b6aa50..3a14855 100644
--- a/tools/host/src/com/android/cts/ReferenceAppTestPackage.java
+++ b/tools/host/src/com/android/cts/ReferenceAppTestPackage.java
@@ -64,7 +64,7 @@
             String appNameSpace, String appPackageName,
             String apkToTestName, String packageUnderTest) throws NoSuchAlgorithmException {
         super(instrumentationRunner, testPkgBinaryName, targetNameSpace, targetBinaryName, version,
-                androidVersion, jarPath, appNameSpace, appPackageName);
+                androidVersion, jarPath, appNameSpace, appPackageName, null);
         this.apkToTestName = apkToTestName;
         this.packageUnderTest = packageUnderTest;
     }
diff --git a/tools/host/src/com/android/cts/SignatureCheckPackage.java b/tools/host/src/com/android/cts/SignatureCheckPackage.java
index ddc06a0..485530e 100644
--- a/tools/host/src/com/android/cts/SignatureCheckPackage.java
+++ b/tools/host/src/com/android/cts/SignatureCheckPackage.java
@@ -61,7 +61,7 @@
             final String androidVersion, final String jarPath, final String appNameSpace,
             final String appPackageName) throws NoSuchAlgorithmException {
         super(instrumentationRunner, testPkgBinaryName, targetNameSpace, targetBinaryName, version,
-                androidVersion, jarPath, appNameSpace, appPackageName);
+                androidVersion, jarPath, appNameSpace, appPackageName, null);
     }
 
     /**
diff --git a/tools/host/src/com/android/cts/TestDevice.java b/tools/host/src/com/android/cts/TestDevice.java
index 6ac56a1..a90f6f1 100644
--- a/tools/host/src/com/android/cts/TestDevice.java
+++ b/tools/host/src/com/android/cts/TestDevice.java
@@ -890,7 +890,7 @@
         }
 
         String name = testPackage.getAppPackageName();
-        if ((javaPkgName != null) && (javaPkgName.length() != 0)) {
+        if ((javaPkgName != null) && !javaPkgName.isEmpty()) {
             name = javaPkgName;
         }
 
diff --git a/tools/host/src/com/android/cts/TestHost.java b/tools/host/src/com/android/cts/TestHost.java
index 52a0553..f0857a5 100644
--- a/tools/host/src/com/android/cts/TestHost.java
+++ b/tools/host/src/com/android/cts/TestHost.java
@@ -70,6 +70,7 @@
 
     private static TestHost sInstance;
     static MODE sMode = MODE.UNINITIALIZED;
+    private static boolean sQuick = false;
 
     public static void main(final String[] mainArgs) {
         CUIOutputStream.println("Android CTS version " + Version.asString());
@@ -349,6 +350,10 @@
                     }
                 }
             }
+
+            if (cp.containsKey(CTSCommand.OPTION_QUICK)) {
+                sQuick = true;
+            }
         }
 
         if ((cfgPath == null) || (cfgPath.length() == 0)) {
@@ -361,9 +366,12 @@
             if (loadConfig(filePath) == false) {
                 exit();
             }
+            if (sQuick) {
+                HostConfig.Ints.valueOf("postInstallWaitMs").setValue(1);
+            }
 
             Log.initLog(sConfig.getLogRoot());
-            sConfig.loadRepositories();
+            sConfig.loadRepositories(sQuick);
         } catch (Exception e) {
             Log.e("Error while parsing cts config file", e);
             exit();
@@ -459,7 +467,9 @@
         TestSessionLog sessionLog = ts.getSessionLog();
         ts.setTestDevice(device);
         ts.getDevice().installDeviceSetupApp();
-        sessionLog.setDeviceInfo(ts.getDevice().getDeviceInfo());
+        if (!sQuick) {
+            sessionLog.setDeviceInfo(ts.getDevice().getDeviceInfo());
+        }
 
         boolean finish = false;
         while (!finish) {
diff --git a/tools/host/src/com/android/cts/TestPackage.java b/tools/host/src/com/android/cts/TestPackage.java
index 8647ade..a332297 100644
--- a/tools/host/src/com/android/cts/TestPackage.java
+++ b/tools/host/src/com/android/cts/TestPackage.java
@@ -49,13 +49,18 @@
     public static final String FINISH = "finish";
     public static final String START = "start";
 
-    private String mName, mVersion, mAndroidVersion;
-    private String mTargetNameSpace, mTargetBinaryName, mInstrumentationRunner;
-    private Collection<TestSuite> mSuites;
+    private final String mName;
+    private final String mVersion;
+    private final String mAndroidVersion;
+    private final String mTargetNameSpace;
+    private final String mTargetBinaryName;
+    private final String mInstrumentationRunner;
+    private final Collection<TestSuite> mSuites;
     private String mDigest;
-    private String mJarPath;
-    private String mAppNameSpace;
-    private String mAppPackageName;
+    private final String mJarPath;
+    private final String mAppNameSpace;
+    private final String mAppPackageName;
+    private final String mJavaPackageFilter;
 
     protected TestSuite mCurrentTestSuite;
 
@@ -79,13 +84,14 @@
      * @param androidVersion The version of the Anroid platform allowed.
      * @param jarPath The host controller's jar path and file.
      * @param appNameSpace The package name space.
-     * @param appPackageName The Java package name of the test package.
+     * @param appPackageName The package name of the test package.
+     * @param javaPackageFilter The prefix used to select which Java packages to run
      */
     public TestPackage(final String instrumentationRunner,
             final String testPkgBinaryName, final String targetNameSpace,
             final String targetBinaryName, final String version,
             final String androidVersion, final String jarPath, final String appNameSpace,
-            final String appPackageName) {
+            final String appPackageName, final String javaPackageFilter) {
         mInstrumentationRunner = instrumentationRunner;
         mName = testPkgBinaryName;
         mTargetNameSpace = targetNameSpace;
@@ -96,6 +102,7 @@
         mJarPath = jarPath;
         mAppNameSpace = appNameSpace;
         mAppPackageName = appPackageName;
+        mJavaPackageFilter = javaPackageFilter;
 
         mDevice = null;
         mTestStop = false;
@@ -114,9 +121,9 @@
     }
 
     /**
-     * Get the app JAVA package name.
+     * Get the app package name.
      *
-     * @return The app JAVA package name.
+     * @return The app package name.
      */
     public String getAppPackageName() {
         return mAppPackageName;
@@ -858,7 +865,7 @@
         mTimeOutTimer.start();
         mProgressObserver = new ProgressObserver();
 
-        if ((javaPkgName != null) && (javaPkgName.length() > 0)) {
+        if ((javaPkgName != null) && !javaPkgName.isEmpty()) {
             runInBatchModeImpl(javaPkgName);
         } else {
             for (String pkgName : getPackageNames()) {
@@ -995,14 +1002,15 @@
             return;
         }
 
-        setup(device, javaPkgName);
-        runImpl(javaPkgName);
+        String javaPackage = (javaPkgName != null) ? javaPkgName : mJavaPackageFilter;
+        setup(device, javaPackage);
+        runImpl(javaPackage);
     }
 
     /**
      * Implementation of running the test package.
      *
-     * @param javaPkgName The JAVA package name.
+     * @param javaPkgName The Java package name.
      * @param profile The profile of the device being tested.
      */
     protected void runImpl(final String javaPkgName) throws IOException,
@@ -1050,7 +1058,7 @@
      * Set up before running.
      *
      * @param device The device to run this package.getName
-     * @param javaPkgName The JAVA package name.
+     * @param javaPkgName The Java package name.
      */
     protected void setup(final TestDevice device, final String javaPkgName) {
         if (!TestSession.isADBServerRestartedMode() || noTestsExecuted()) {
diff --git a/tools/host/src/com/android/cts/TestSessionBuilder.java b/tools/host/src/com/android/cts/TestSessionBuilder.java
index de937a6..fd520a7 100644
--- a/tools/host/src/com/android/cts/TestSessionBuilder.java
+++ b/tools/host/src/com/android/cts/TestSessionBuilder.java
@@ -65,6 +65,7 @@
     private static final String ATTRIBUTE_FRAMEWORK_VERSION = "AndroidFramework";
     private static final String ATTRIBUTE_APK_TO_TEST_NAME = "apkToTestName";
     private static final String ATTRIBUTE_PACKAGE_TO_TEST = "packageToTest";
+    private static final String ATTRIBUTE_JAVA_PACKAGE_FILTER = "javaPackageFilter";
     private static TestSessionBuilder sInstance;
 
     private DocumentBuilder mDocBuilder;
@@ -208,22 +209,21 @@
     public TestPackage loadPackage(final Node pkgNode, ArrayList<String> excludedList)
                                 throws NoSuchAlgorithmException {
 
-        String appBinaryName, targetNameSpace, targetBinaryName, version, frameworkVersion,
-               runner, jarPath, appNameSpace, appPackageName, hostSideOnly;
         NodeList suiteList = pkgNode.getChildNodes();
 
-        appBinaryName = getStringAttributeValue(pkgNode, ATTRIBUTE_NAME);
-        targetNameSpace = getStringAttributeValue(pkgNode, ATTRIBUTE_TARGET_NAME_SPACE);
-        targetBinaryName = getStringAttributeValue(pkgNode, ATTRIBUTE_TARGET_BINARY_NAME);
-        version = getStringAttributeValue(pkgNode, ATTRIBUTE_VERSION);
-        frameworkVersion = getStringAttributeValue(pkgNode, ATTRIBUTE_FRAMEWORK_VERSION);
-        runner = getStringAttributeValue(pkgNode, ATTRIBUTE_RUNNER);
-        jarPath = getStringAttributeValue(pkgNode, ATTRIBUTE_JAR_PATH);
-        appNameSpace = getStringAttributeValue(pkgNode, ATTRIBUTE_APP_NAME_SPACE);
-        appPackageName = getStringAttributeValue(pkgNode, ATTRIBUTE_APP_PACKAGE_NAME);
-        hostSideOnly = getStringAttributeValue(pkgNode, ATTRIBUTE_HOST_SIDE_ONLY);
+        String appBinaryName = getStringAttributeValue(pkgNode, ATTRIBUTE_NAME);
+        String targetNameSpace = getStringAttributeValue(pkgNode, ATTRIBUTE_TARGET_NAME_SPACE);
+        String targetBinaryName = getStringAttributeValue(pkgNode, ATTRIBUTE_TARGET_BINARY_NAME);
+        String version = getStringAttributeValue(pkgNode, ATTRIBUTE_VERSION);
+        String frameworkVersion = getStringAttributeValue(pkgNode, ATTRIBUTE_FRAMEWORK_VERSION);
+        String runner = getStringAttributeValue(pkgNode, ATTRIBUTE_RUNNER);
+        String jarPath = getStringAttributeValue(pkgNode, ATTRIBUTE_JAR_PATH);
+        String appNameSpace = getStringAttributeValue(pkgNode, ATTRIBUTE_APP_NAME_SPACE);
+        String appPackageName = getStringAttributeValue(pkgNode, ATTRIBUTE_APP_PACKAGE_NAME);
+        String hostSideOnly = getStringAttributeValue(pkgNode, ATTRIBUTE_HOST_SIDE_ONLY);
         String signature = getStringAttributeValue(pkgNode, ATTRIBUTE_SIGNATURE_CHECK);
         String referenceAppTest = getStringAttributeValue(pkgNode, ATTRIBUTE_REFERENCE_APP_TEST);
+        String javaPackageFilter = getStringAttributeValue(pkgNode, ATTRIBUTE_JAVA_PACKAGE_FILTER);
         TestPackage pkg = null;
 
         if ("true".equals(referenceAppTest)) {
@@ -241,8 +241,8 @@
             pkg = new HostSideOnlyPackage(appBinaryName, version, frameworkVersion,
                     jarPath, appPackageName);
         } else {
-            pkg = new TestPackage(runner, appBinaryName, targetNameSpace, targetBinaryName,
-                    version, frameworkVersion, jarPath, appNameSpace, appPackageName);
+            pkg = new TestPackage(runner, appBinaryName, targetNameSpace, targetBinaryName, version,
+                    frameworkVersion, jarPath, appNameSpace, appPackageName, javaPackageFilter);
         }
 
         for (int i = 0; i < suiteList.getLength(); i++) {
diff --git a/tools/host/src/com/android/cts/TestSessionLog.java b/tools/host/src/com/android/cts/TestSessionLog.java
index bf5b3e8..7eb9ffd 100644
--- a/tools/host/src/com/android/cts/TestSessionLog.java
+++ b/tools/host/src/com/android/cts/TestSessionLog.java
@@ -489,7 +489,7 @@
         String[] processNames = rootProcesses.split(";");
         for (String processName : processNames) {
             processName = processName.trim();
-            if (processName.length() > 0) {
+            if (!processName.isEmpty()) {
                 Node process = document.createElement(TAG_PROCESS);
                 processInfo.appendChild(process);
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
index 4a2d56c..9bc0945 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.tradefed.build;
 
+import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.build.IFolderBuildInfo;
 
 import java.io.File;
@@ -57,6 +58,29 @@
     }
 
     /**
+     * A helper factory method that creates and validates a {@link CtsBuildHelper} given an
+     * {@link IBuildInfo}.
+     *
+     * @param build the {@link IBuildInfo}
+     * @return the {@link CtsBuildHelper}
+     * @throws IllegalArgumentException if provided <var>build</var> is not a valid CTS build
+     */
+    public static CtsBuildHelper createBuildHelper(IBuildInfo build) {
+        if (!(build instanceof IFolderBuildInfo)) {
+            throw new IllegalArgumentException(String.format(
+                    "Wrong build type. Expected %s, received %s", IFolderBuildInfo.class.getName(),
+                    build.getClass().getName()));
+        }
+        try {
+            CtsBuildHelper ctsBuild = new CtsBuildHelper((IFolderBuildInfo)build);
+            ctsBuild.validateStructure();
+            return ctsBuild;
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException("Invalid CTS build provided.", e);
+        }
+    }
+
+    /**
      * @return a {@link File} representing the parent folder of the CTS installation
      */
     public File getRootDir() {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index 2834793..eea5b0e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -22,17 +22,18 @@
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.Option;
+import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.result.InputStreamSource;
+import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.IResumableTest;
 import com.android.tradefed.testtype.IShardableTest;
-import com.android.tradefed.testtype.InstrumentationTest;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
 import java.io.BufferedInputStream;
@@ -66,36 +67,45 @@
 
     private ITestDevice mDevice;
 
-    @Option(name = PLAN_OPTION, description = "the test plan to run")
+    @Option(name = PLAN_OPTION, description = "the test plan to run.",
+            importance = Importance.IF_UNSET)
     private String mPlanName = null;
 
-    @Option(name = PACKAGE_OPTION, description = "the test packages(s) to run")
+    @Option(name = PACKAGE_OPTION, description = "the test packages(s) to run.",
+            importance = Importance.IF_UNSET)
     private Collection<String> mPackageNames = new ArrayList<String>();
 
-    @Option(name = "exclude-package", description = "the test packages(s) to exclude from the run")
+    @Option(name = "exclude-package", description = "the test packages(s) to exclude from the run.")
     private Collection<String> mExcludedPackageNames = new ArrayList<String>();
 
-    @Option(name = CLASS_OPTION, shortName = 'c', description = "run a specific test class")
+    @Option(name = CLASS_OPTION, shortName = 'c', description = "run a specific test class.",
+            importance = Importance.IF_UNSET)
     private String mClassName = null;
 
     @Option(name = METHOD_OPTION, shortName = 'm',
-            description = "run a specific test method, from given --class")
+            description = "run a specific test method, from given --class.",
+            importance = Importance.IF_UNSET)
     private String mMethodName = null;
 
     @Option(name = "collect-device-info", description =
-        "flag to control whether to collect info from device. Default true")
+        "flag to control whether to collect info from device. Turning this off will speed up test" +
+        "execution for short test runs but will result in required data being omitted from the " +
+        "test report.")
     private boolean mCollectDeviceInfo = true;
 
     @Option(name = "resume", description =
-        "flag to attempt to automatically resume aborted test run on another connected device. " +
-        "Default false.")
+        "flag to attempt to automatically resume aborted test run on another connected device. ")
     private boolean mResume = false;
 
     @Option(name = "shards", description =
         "shard the tests to run into separately runnable chunks to execute on multiple devices " +
-        "concurrently")
+        "concurrently.")
     private int mShards = 1;
 
+    @Option(name = "screenshot", description =
+        "flag for taking a screenshot of the device when test execution is complete.")
+    private boolean mScreenshot = false;
+
     /** data structure for a {@link IRemoteTest} and its known tests */
     private class KnownTests {
         private final IRemoteTest mTestForPackage;
@@ -119,6 +129,7 @@
     private List<KnownTests> mRemainingTests = null;
 
     private CtsBuildHelper mCtsBuild = null;
+    private IBuildInfo mBuildInfo = null;
 
     /**
      * {@inheritDoc}
@@ -201,17 +212,8 @@
      */
     @Override
     public void setBuild(IBuildInfo build) {
-        if (!(build instanceof IFolderBuildInfo)) {
-            throw new IllegalArgumentException(String.format(
-                    "Wrong build type. Expected %s, received %s", IFolderBuildInfo.class.getName(),
-                    build.getClass().getName()));
-        }
-        try {
-            mCtsBuild = new CtsBuildHelper((IFolderBuildInfo)build);
-            mCtsBuild.validateStructure();
-        } catch (FileNotFoundException e) {
-            throw new IllegalArgumentException("Invalid CTS build provided.", e);
-        }
+        mCtsBuild = CtsBuildHelper.createBuildHelper(build);
+        mBuildInfo = build;
     }
 
     /**
@@ -249,16 +251,23 @@
             if (test instanceof IDeviceTest) {
                 ((IDeviceTest)test).setDevice(getDevice());
             }
-            // Increment the timeout for collecting the tests.
-            // TODO: move this to testPackage.createTest() instead and only increase timeout when
-            // tests number is large.
-            if (test instanceof InstrumentationTest) {
-                ((InstrumentationTest)test).setCollectsTestsShellTimeout(10*60*1000);
+            if (test instanceof IBuildReceiver) {
+                ((IBuildReceiver)test).setBuild(mBuildInfo);
             }
+
             ResultFilter filter = new ResultFilter(listener, testPair.getKnownTests());
             test.run(filter);
             mRemainingTests.remove(0);
         }
+
+        if (mScreenshot) {
+            InputStreamSource screenshotSource = getDevice().getScreenshot();
+            try {
+                listener.testLog("screenshot", LogDataType.PNG, screenshotSource);
+            } finally {
+                screenshotSource.cancel();
+            }
+        }
     }
 
     /**
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
index e4f13b5..f4258d1 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
@@ -27,7 +27,7 @@
  * <p/>
  * Knows how to translate this info into a runnable {@link IRemoteTest}.
  */
-interface ITestPackageDef {
+public interface ITestPackageDef {
 
     /**
      * Get the unique URI of the test package.
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
new file mode 100644
index 0000000..e1bb91e
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+package com.android.cts.tradefed.testtype;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.testtype.InstrumentationTest;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Assert;
+
+/**
+ * A {@link InstrumentationTest] that will install CTS apks before test execution,
+ * and uninstall on execution completion.
+ */
+public class InstrumentationApkTest extends InstrumentationTest implements IBuildReceiver {
+
+    private static final String LOG_TAG = "InstrumentationApkTest";
+
+    /** the file names of the CTS apks to install */
+    private Collection<String> mInstallFileNames = new ArrayList<String>();
+    private Collection<String> mUninstallPackages = new ArrayList<String>();
+
+    private CtsBuildHelper mCtsBuild = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuild(IBuildInfo build) {
+        mCtsBuild  = CtsBuildHelper.createBuildHelper(build);
+    }
+
+    /**
+     * Add an apk to install.
+     *
+     * @param apkFileName the apk file name
+     * @param packageName the apk's Android package name
+     */
+    public void addInstallApk(String apkFileName, String packageName) {
+        mInstallFileNames.add(apkFileName);
+        mUninstallPackages.add(packageName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void run(final ITestInvocationListener listener)
+            throws DeviceNotAvailableException {
+        Assert.assertNotNull("missing device", getDevice());
+        Assert.assertNotNull("missing build", mCtsBuild);
+
+        try {
+            for (String apkFileName : mInstallFileNames) {
+                Log.d(LOG_TAG, String.format("Installing %s on %s", apkFileName,
+                        getDevice().getSerialNumber()));
+                try {
+                    getDevice().installPackage(mCtsBuild.getTestApp(apkFileName), true);
+                } catch (FileNotFoundException e) {
+                    Log.e(LOG_TAG, e);
+                }
+            }
+            super.run(listener);
+        } finally {
+            for (String packageName : mUninstallPackages) {
+                Log.d(LOG_TAG, String.format("Uninstalling %s on %s", packageName,
+                        getDevice().getSerialNumber()));
+                getDevice().uninstallPackage(packageName);
+            }
+        }
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationAppTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationAppTest.java
deleted file mode 100644
index 47fc14a..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationAppTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-package com.android.cts.tradefed.testtype;
-
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.testtype.InstrumentationTest;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * A {@link InstrumentationTest] that will install other dependent apks before test execution,
- * and uninstall apps on execution completion.
- */
-public class InstrumentationAppTest extends InstrumentationTest {
-
-    private static final String LOG_TAG = "InstrumentationAppTest";
-
-    // TODO: consider moving this class to tradefed proper
-
-    private Collection<File> mInstallFiles = new ArrayList<File>();
-    private Collection<String> mInstallPackages = new ArrayList<String>();
-
-    /**
-     * Add a dependent apk to install.
-     *
-     * @param apkFile the apk file
-     * @param packageName the apk's Android package name
-     */
-    public void addInstallApp(File apkFile, String packageName) {
-        mInstallFiles.add(apkFile);
-        mInstallPackages.add(packageName);
-    }
-
-    @Override
-    public void run(final ITestInvocationListener listener)
-            throws DeviceNotAvailableException {
-        if (getDevice() == null) {
-            throw new IllegalStateException("missing device");
-        }
-        try {
-            for (File apkFile : mInstallFiles) {
-                Log.d(LOG_TAG, String.format("Installing %s on %s", apkFile.getName(),
-                        getDevice().getSerialNumber()));
-                getDevice().installPackage(apkFile, true);
-            }
-            super.run(listener);
-        } finally {
-            for (String packageName : mInstallPackages) {
-                Log.d(LOG_TAG, String.format("Uninstalling %s on %s", packageName,
-                        getDevice().getSerialNumber()));
-                getDevice().uninstallPackage(packageName);
-            }
-        }
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
index 041079d..eed5223 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
@@ -15,12 +15,15 @@
  */
 package com.android.cts.tradefed.testtype;
 
+import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.JUnitToInvocationResultForwarder;
+import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.util.CommandStatus;
@@ -28,6 +31,7 @@
 import com.android.tradefed.util.RunUtil;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -39,29 +43,68 @@
 import junit.framework.TestResult;
 
 /**
- * A {@link IRemoteTest} that can run a set of JUnit tests from a jar.
+ * A {@link IRemoteTest} that can run a set of JUnit tests from a CTS jar.
  */
-public class JarHostTest implements IDeviceTest, IRemoteTest {
+public class JarHostTest implements IDeviceTest, IRemoteTest, IBuildReceiver {
 
     private static final String LOG_TAG = "JarHostTest";
 
     private ITestDevice mDevice;
-    private File mJarFile;
+    private String mJarFileName;
     private Collection<TestIdentifier> mTests;
     private long mTimeoutMs = 10 * 60 * 1000;
     private String mRunName;
-    private String mTestAppPath;
+    private CtsBuildHelper mCtsBuild = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    /**
+     * Set the CTS build container.
+     * <p/>
+     * Exposed so unit tests can mock the provided build.
+     *
+     * @param buildHelper
+     */
+    void setBuildHelper(CtsBuildHelper buildHelper) {
+        mCtsBuild = buildHelper;
+    }
+
+    /**
+     * Get the CTS build container.
+     *
+     * @return {@link CtsBuildHelper}
+     */
+    CtsBuildHelper getBuildHelper() {
+        return mCtsBuild;
+    }
 
     /**
      * Set the jar file to load tests from.
-     * @param jarFile
+     *
+     * @param jarFileName the file name of the CTS host test jar to use
      */
-    void setJarFile(File jarFile) {
-        mJarFile = jarFile;
+    void setJarFileName(String jarFileName) {
+        mJarFileName = jarFileName;
+    }
+
+    /**
+     * Gets the jar file to load tests from.
+     *
+     * @return jarFileName the file name of the CTS host test jar to use
+     */
+    String getJarFileName() {
+        return mJarFileName;
     }
 
     /**
      * Sets the collection of tests to run
+     *
      * @param tests
      */
     void setTests(Collection<TestIdentifier> tests) {
@@ -69,6 +112,15 @@
     }
 
     /**
+     * Gets the collection of tests to run
+     *
+     * @return Collection<{@link TestIdentifier}>
+     */
+    Collection<TestIdentifier> getTests() {
+        return mTests;
+    }
+
+    /**
      * Set the maximum time in ms each test should run.
      * <p/>
      * Tests that take longer than this amount will be failed with a {@link TestTimeoutException}
@@ -90,17 +142,6 @@
     }
 
     /**
-     * Set the filesystem path to test app artifacts needed to run tests.
-     *
-     * @see {@link com.android.hosttest.DeviceTest#setTestAppPath(String)}
-     *
-     * @param testAppPath
-     */
-    void setTestAppPath(String testAppPath) {
-        mTestAppPath = testAppPath;
-    }
-
-    /**
      * {@inheritDoc}
      */
     @Override
@@ -153,9 +194,9 @@
             // all host tests are converted to use tradefed
             com.android.hosttest.DeviceTest deviceTest = (com.android.hosttest.DeviceTest)junitTest;
             deviceTest.setDevice(getDevice().getIDevice());
-            deviceTest.setTestAppPath(mTestAppPath);
+            deviceTest.setTestAppPath(mCtsBuild.getTestCasesDir().getAbsolutePath());
         }
-        CommandStatus status = RunUtil.getInstance().runTimed(mTimeoutMs, new IRunnableResult() {
+        CommandStatus status = RunUtil.getDefault().runTimed(mTimeoutMs, new IRunnableResult() {
 
             @Override
             public boolean run() throws Exception {
@@ -167,7 +208,7 @@
             public void cancel() {
                 // ignore
             }
-        });
+        }, true);
         if (status.equals(CommandStatus.TIMED_OUT)) {
             junitResult.addError(junitTest, new TestTimeoutException());
             junitResult.endTest(junitTest);
@@ -183,7 +224,8 @@
      */
     private Test loadTest(String className, String testName) {
         try {
-            URL urls[] = {mJarFile.getCanonicalFile().toURI().toURL()};
+            File jarFile = mCtsBuild.getTestApp(mJarFileName);
+            URL urls[] = {jarFile.getCanonicalFile().toURI().toURL()};
             Class<?> testClass = loadClass(className, urls);
 
             if (TestCase.class.isAssignableFrom(testClass)) {
@@ -195,16 +237,16 @@
                 return test;
             } else {
                 Log.e(LOG_TAG, String.format("Class '%s' from jar '%s' is not a Test",
-                        className, mJarFile.getAbsolutePath()));
+                        className, mJarFileName));
             }
         } catch (ClassNotFoundException e) {
-            reportLoadError(mJarFile, className, e);
+            reportLoadError(mJarFileName, className, e);
         } catch (IllegalAccessException e) {
-            reportLoadError(mJarFile, className, e);
+            reportLoadError(mJarFileName, className, e);
         } catch (IOException e) {
-            reportLoadError(mJarFile, className, e);
+            reportLoadError(mJarFileName, className, e);
         } catch (InstantiationException e) {
-            reportLoadError(mJarFile, className, e);
+            reportLoadError(mJarFileName, className, e);
         }
         return null;
     }
@@ -225,27 +267,37 @@
         return testClass;
     }
 
-    private void reportLoadError(File jarFile, String className, Exception e) {
+    private void reportLoadError(String jarFileName, String className, Exception e) {
         Log.e(LOG_TAG, String.format("Failed to load test class '%s' from jar '%s'",
-                className, jarFile.getAbsolutePath()));
+                className, jarFileName));
         Log.e(LOG_TAG, e);
     }
 
     /**
      * Checks that all mandatory member fields has been set.
      */
-    private void checkFields() {
+    protected void checkFields() {
         if (mRunName == null) {
             throw new IllegalArgumentException("run name has not been set");
         }
         if (mDevice == null) {
             throw new IllegalArgumentException("Device has not been set");
         }
-        if (mJarFile == null) {
-            throw new IllegalArgumentException("jar file has not been set");
+        if (mJarFileName == null) {
+            throw new IllegalArgumentException("jar file name has not been set");
         }
         if (mTests == null) {
             throw new IllegalArgumentException("tests has not been set");
         }
+        if (mCtsBuild == null) {
+            throw new IllegalArgumentException("build has not been set");
+        }
+        try {
+            mCtsBuild.getTestApp(mJarFileName);
+        } catch (FileNotFoundException e) {
+            throw new IllegalArgumentException(String.format(
+                    "Could not find jar %s in CTS build %s", mJarFileName,
+                    mCtsBuild.getRootDir().getAbsolutePath()));
+        }
     }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index fd896f2..20396f7 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -41,11 +41,13 @@
     private String mName = null;
     private String mRunner = null;
     private boolean mIsHostSideTest = false;
+    private boolean mIsVMHostTest = false;
     private String mJarPath = null;
     private boolean mIsSignatureTest = false;
     private boolean mIsReferenceAppTest = false;
     private String mPackageToTest = null;
     private String mApkToTestName = null;
+    private String mTestPackageName = null;
 
     // use a LinkedHashSet for predictable iteration insertion-order, and fast lookups
     private Collection<TestIdentifier> mTests = new LinkedHashSet<TestIdentifier>();
@@ -96,6 +98,14 @@
         return mIsHostSideTest;
     }
 
+    void setIsVMHostTest(boolean vmHostTest) {
+        mIsVMHostTest = vmHostTest;
+
+    }
+
+    boolean isVMHostTest() {
+        return mIsVMHostTest;
+    }
     void setJarPath(String jarPath) {
         mJarPath = jarPath;
     }
@@ -124,6 +134,10 @@
         mPackageToTest = packageName;
     }
 
+    void setTestPackageName(String testPackageName) {
+        mTestPackageName = testPackageName;
+    }
+
     void setApkToTest(String apkName) {
         mApkToTestName = apkName;
     }
@@ -136,16 +150,22 @@
             Log.d(LOG_TAG, String.format("Creating host test for %s", mName));
             JarHostTest hostTest = new JarHostTest();
             hostTest.setRunName(mName);
-            hostTest.setJarFile(new File(testCaseDir, mJarPath));
-            hostTest.setTestAppPath(testCaseDir.getAbsolutePath());
+            hostTest.setJarFileName(mJarPath);
             hostTest.setTests(filterTests(mTests, className, methodName));
             return hostTest;
+        } else if (mIsVMHostTest) {
+            Log.d(LOG_TAG, String.format("Creating vm host test for %s", mName));
+            VMHostTest vmHostTest = new VMHostTest();
+            vmHostTest.setRunName(mName);
+            vmHostTest.setJarFileName(mJarPath);
+            vmHostTest.setTests(filterTests(mTests, className, methodName));
+            return vmHostTest;
         } else if (mIsSignatureTest) {
             // TODO: hardcode the runner/class/method for now, since current package xml
             // points to specialized instrumentation. Eventually this special case for signatureTest
             // can be removed, and it can be treated just like a normal InstrumentationTest
             Log.d(LOG_TAG, String.format("Creating signature test %s", mName));
-            InstrumentationTest instrTest = new InstrumentationTest();
+            InstrumentationApkTest instrTest = new InstrumentationApkTest();
             instrTest.setPackageName(mAppNameSpace);
             instrTest.setRunnerName("android.test.InstrumentationTestRunner");
             instrTest.setClassName(SIGNATURE_TEST_CLASS);
@@ -153,34 +173,22 @@
             // add signature test to list of known tests
             addTest(new TestIdentifier(SIGNATURE_TEST_CLASS, SIGNATURE_TEST_METHOD));
             // mName means 'apk file name' for instrumentation tests
-            File apkFile = new File(testCaseDir, String.format("%s.apk", mName));
-            if (!apkFile.exists()) {
-                Log.w(LOG_TAG, String.format("Could not find apk file %s",
-                        apkFile.getAbsolutePath()));
-                return null;
-            }
-            instrTest.setInstallFile(apkFile);
+            instrTest.addInstallApk(String.format("%s.apk", mName), mAppNameSpace);
             return instrTest;
         } else if (mIsReferenceAppTest) {
             // a reference app test is just a InstrumentationTest with one extra apk to install
-            InstrumentationAppTest instrTest = new InstrumentationAppTest();
-            File apkFile = new File(testCaseDir, String.format("%s.apk", mApkToTestName));
-            if (!apkFile.exists()) {
-                Log.w(LOG_TAG, String.format("Could not find apk file %s",
-                        apkFile.getAbsolutePath()));
-                return null;
-            }
-            instrTest.addInstallApp(apkFile, mPackageToTest);
-            return setInstrumentationTest(testCaseDir, className, methodName, instrTest);
+            InstrumentationApkTest instrTest = new InstrumentationApkTest();
+            instrTest.addInstallApk(String.format("%s.apk", mApkToTestName), mPackageToTest);
+            return setInstrumentationTest(className, methodName, instrTest);
         } else {
             Log.d(LOG_TAG, String.format("Creating instrumentation test for %s", mName));
-            InstrumentationTest instrTest = new InstrumentationTest();
-            return setInstrumentationTest(testCaseDir, className, methodName, instrTest);
+            InstrumentationApkTest instrTest = new InstrumentationApkTest();
+            return setInstrumentationTest(className, methodName, instrTest);
         }
     }
 
     /**
-     * Populates given {@link InstrumentationTest} with data from the package xml
+     * Populates given {@link InstrumentationApkTest} with data from the package xml
      *
      * @param testCaseDir
      * @param className
@@ -188,20 +196,19 @@
      * @param instrTest
      * @return the populated {@link InstrumentationTest} or <code>null</code>
      */
-    private InstrumentationTest setInstrumentationTest(File testCaseDir, String className,
-            String methodName, InstrumentationTest instrTest) {
+    private InstrumentationApkTest setInstrumentationTest(String className,
+            String methodName, InstrumentationApkTest instrTest) {
         instrTest.setPackageName(mAppNameSpace);
         instrTest.setRunnerName(mRunner);
+        instrTest.setTestPackageName(mTestPackageName);
         instrTest.setClassName(className);
         instrTest.setMethodName(methodName);
         // mName means 'apk file name' for instrumentation tests
-        File apkFile = new File(testCaseDir, String.format("%s.apk", mName));
-        if (!apkFile.exists()) {
-            Log.w(LOG_TAG, String.format("Could not find apk file %s",
-                    apkFile.getAbsolutePath()));
-            return null;
+        instrTest.addInstallApk(String.format("%s.apk", mName), mAppNameSpace);
+        if (mTests.size() > 1000) {
+            // TODO: hack, large test suites can take longer to collect tests, increase timeout
+            instrTest.setCollectsTestsShellTimeout(10*60*1000);
         }
-        instrTest.setInstallFile(apkFile);
         return instrTest;
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
index d12fb9d..fa2423f 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
@@ -67,11 +67,13 @@
                 final String packageName = attributes.getValue("name");
                 final String runnerName = attributes.getValue("runner");
                 final String hostSideTest = attributes.getValue("hostSideOnly");
+                final String vmHostTest = attributes.getValue("vmHostTest");
                 final String jarPath = attributes.getValue("jarPath");
                 final String signatureCheck = attributes.getValue("signatureCheck");
                 final String referenceApp = attributes.getValue("referenceAppTest");
                 final String apkToTest = attributes.getValue("apkToTestName");
                 final String packageToTest = attributes.getValue("packageToTest");
+                final String javaPackageFilter = attributes.getValue("javaPackageFilter");
 
                 mPackageDef = new TestPackageDef();
                 mPackageDef.setUri(entryUriValue);
@@ -79,11 +81,13 @@
                 mPackageDef.setName(packageName);
                 mPackageDef.setRunner(runnerName);
                 mPackageDef.setIsHostSideTest(parseBoolean(hostSideTest));
+                mPackageDef.setIsVMHostTest(parseBoolean(vmHostTest));
                 mPackageDef.setJarPath(jarPath);
                 mPackageDef.setIsSignatureCheck(parseBoolean(signatureCheck));
                 mPackageDef.setIsReferenceApp(parseBoolean(referenceApp));
                 mPackageDef.setApkToTest(apkToTest);
                 mPackageDef.setPackageToTest(packageToTest);
+                mPackageDef.setTestPackageName(javaPackageFilter);
 
                 // reset the class name
                 mClassNameStack = new Stack<String>();
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
new file mode 100644
index 0000000..22c2738
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+package com.android.cts.tradefed.testtype;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.util.FileUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipFile;
+
+/**
+ * A wrapper around {@link JarHostTest} that includes additional device setup and clean up.
+ *
+ */
+public class VMHostTest extends JarHostTest {
+
+    private static final String LOG_TAG = "VMHostTest";
+    private static final String VM_TEST_TEMP_DIR = "/data/local/tmp/vm-tests";
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
+        if (!installVmPrereqs(getDevice(), getBuildHelper())) {
+            throw new RuntimeException(String.format(
+                    "Failed to install vm-tests prereqs on device %s",
+                    getDevice().getSerialNumber()));
+        }
+        super.run(listener);
+    }
+
+    /**
+     * Install pre-requisite jars for running vm-tests, creates temp directories for test.
+     *
+     * @param device the {@link ITestDevice}
+     * @param ctsBuild the {@link CtsBuildHelper}
+     * @throws DeviceNotAvailableException
+     * @return true if test jar files are extracted and pushed to device successfully
+     */
+    private boolean installVmPrereqs(ITestDevice device, CtsBuildHelper ctsBuild)
+            throws DeviceNotAvailableException {
+        if (device.doesFileExist(VM_TEST_TEMP_DIR)) {
+            Log.d(LOG_TAG, String.format("Removing device's temp dir %s from previous runs.",
+                    VM_TEST_TEMP_DIR));
+            device.executeShellCommand(String.format("rm -r %s", VM_TEST_TEMP_DIR));
+        }
+        // Creates temp directory recursively. We also need to create the dalvik-cache directory
+        // which is used by the dalvikvm to optimize things. Without the dalvik-cache, there will be
+        // a sigsev thrown by the vm.
+        Log.d(LOG_TAG, "Creating device temp directory, including dalvik-cache.");
+        createRemoteDir(device, VM_TEST_TEMP_DIR + "/dalvik-cache" );
+        try {
+            File localTmpDir = FileUtil.createTempDir("cts-vm", new File("/tmp/"));
+            Log.d(LOG_TAG, String.format("Creating host temp dir %s", localTmpDir.getPath()));
+            File jarFile = new File(ctsBuild.getTestCasesDir(), getJarFileName());
+            if (!jarFile.exists()) {
+                Log.e(LOG_TAG, String.format("Missing jar file %s", jarFile.getPath()));
+                return false;
+            }
+            Log.d(LOG_TAG, String.format("Extracting jar file %s to host temp directory %s.",
+                    jarFile.getPath(), localTmpDir.getPath()));
+            ZipFile zipFile = new ZipFile(jarFile);
+            FileUtil.extractZip(zipFile, localTmpDir);
+            File localTestTmpDir = new File(localTmpDir, "tests/dot");
+            Log.d(LOG_TAG, String.format("Syncing host dir %s to device dir %s",
+                    localTestTmpDir.getPath(), VM_TEST_TEMP_DIR));
+            device.syncFiles(localTestTmpDir, VM_TEST_TEMP_DIR);
+            Log.d(LOG_TAG, String.format("Cleaning up host temp dir %s", localTmpDir.getPath()));
+            FileUtil.recursiveDelete(localTmpDir);
+        } catch (IOException e) {
+            Log.e(LOG_TAG, String.format("Failed to extract jar file %s and sync it to device %s.",
+                    getJarFileName(), device.getSerialNumber()));
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Creates the file directory recursively in the device.
+     *
+     * @param device the {@link ITestDevice}
+     * @param remoteFilePath the absolute path.
+     * @throws DeviceNotAvailableException
+     */
+    private void createRemoteDir(ITestDevice device, String remoteFilePath)
+            throws DeviceNotAvailableException {
+        if (device.doesFileExist(remoteFilePath)) {
+            return;
+        }
+        File f = new File(remoteFilePath);
+        String parentPath = f.getParent();
+        if (parentPath != null) {
+            createRemoteDir(device, parentPath);
+        }
+        device.executeShellCommand(String.format("mkdir %s", remoteFilePath));
+    }
+}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
index 9a49b77..dfe4413 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.cts.tradefed.testtype;
 
+import com.android.cts.tradefed.build.StubCtsBuildHelper;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
@@ -22,7 +23,6 @@
 
 import org.easymock.EasyMock;
 
-import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -37,6 +37,8 @@
 
     private static final String RUN_NAME = "run";
     private JarHostTest mJarTest;
+    private StubCtsBuildHelper mStubBuildHelper;
+
 
     @Override
     protected void setUp() throws Exception {
@@ -48,6 +50,8 @@
                 return MockTest.class;
             }
         };
+        mStubBuildHelper = new StubCtsBuildHelper();
+        mJarTest.setBuildHelper(mStubBuildHelper);
     }
 
     public static class MockTest extends TestCase {
@@ -80,7 +84,7 @@
         listener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.EMPTY_MAP));
         mJarTest.setTests(tests);
         mJarTest.setDevice(EasyMock.createMock(ITestDevice.class));
-        mJarTest.setJarFile(new File("fakefile"));
+        mJarTest.setJarFileName("fakefile");
         mJarTest.setRunName(RUN_NAME);
 
         EasyMock.replay(listener);
diff --git a/tools/utils/CollectAllTests.java b/tools/utils/CollectAllTests.java
index c443db2..69c77eb 100644
--- a/tools/utils/CollectAllTests.java
+++ b/tools/utils/CollectAllTests.java
@@ -32,13 +32,17 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
@@ -51,170 +55,177 @@
 
 public class CollectAllTests extends DescriptionGenerator {
 
-    static final String ATTRIBUTE_RUNNER = "runner";
-    static final String ATTRIBUTE_PACKAGE = "appPackageName";
-    static final String ATTRIBUTE_NS = "appNameSpace";
-    static final String ATTRIBUTE_TARGET = "targetNameSpace";
-    static final String ATTRIBUTE_TARGET_BINARY = "targetBinaryName";
-    static final String ATTRIBUTE_HOST_SIDE_ONLY = "hostSideOnly";
-    static final String ATTRIBUTE_JAR_PATH = "jarPath";
+    private static final String ATTRIBUTE_RUNNER = "runner";
+    private static final String ATTRIBUTE_PACKAGE = "appPackageName";
+    private static final String ATTRIBUTE_NS = "appNameSpace";
+    private static final String ATTRIBUTE_TARGET = "targetNameSpace";
+    private static final String ATTRIBUTE_TARGET_BINARY = "targetBinaryName";
+    private static final String ATTRIBUTE_HOST_SIDE_ONLY = "hostSideOnly";
+    private static final String ATTRIBUTE_VM_HOST_TEST = "vmHostTest";
+    private static final String ATTRIBUTE_JAR_PATH = "jarPath";
+    private static final String ATTRIBUTE_JAVA_PACKAGE_FILTER = "javaPackageFilter";
 
-    static final String JAR_PATH = "LOCAL_JAR_PATH :=";
-    static final String TEST_TYPE = "LOCAL_TEST_TYPE :";
-
-    static final int HOST_SIDE_ONLY = 1;
-    static final int DEVICE_SIDE_ONLY = 2;
-
-    private static String runner;
-    private static String packageName;
-    private static String target;
-    private static String xmlName;
-    private static int testType;
-    private static String jarPath;
-
-    private static Map<String,TestClass> testCases;
-    private static Set<String> failed = new HashSet<String>();
-
-    private static class MyXMLGenerator extends XMLGenerator {
-
-        MyXMLGenerator(String outputPath) throws ParserConfigurationException {
-            super(outputPath);
-
-            Node testPackageElem = mDoc.getDocumentElement();
-
-            setAttribute(testPackageElem, ATTRIBUTE_NAME, xmlName);
-            setAttribute(testPackageElem, ATTRIBUTE_RUNNER, runner);
-            setAttribute(testPackageElem, ATTRIBUTE_PACKAGE, packageName);
-            setAttribute(testPackageElem, ATTRIBUTE_NS, packageName);
-
-            if (testType == HOST_SIDE_ONLY) {
-                setAttribute(testPackageElem, ATTRIBUTE_HOST_SIDE_ONLY, "true");
-                setAttribute(testPackageElem, ATTRIBUTE_JAR_PATH, jarPath);
-            }
-
-            if (!packageName.equals(target)) {
-                setAttribute(testPackageElem, ATTRIBUTE_TARGET, target);
-                setAttribute(testPackageElem, ATTRIBUTE_TARGET_BINARY, target);
-            }
-        }
-    }
-
-    private static String OUTPUTFILE = "";
-    private static String MANIFESTFILE = "";
-    private static String TESTSUITECLASS = "";
-    private static String ANDROID_MAKE_FILE = "";
-    private static String LIBCORE_EXPECTATION_DIR = null;
-
-    private static Test TESTSUITE;
-
-    static XMLGenerator xmlGenerator;
-    private static ExpectationStore libcoreVogarExpectationStore;
-    private static ExpectationStore ctsVogarExpectationStore;
+    private static final String JAR_PATH = "LOCAL_JAR_PATH :=";
+    private static final String TEST_TYPE = "LOCAL_TEST_TYPE :";
 
     public static void main(String[] args) {
-        if (args.length > 2) {
-            OUTPUTFILE = args[0];
-            MANIFESTFILE = args [1];
-            TESTSUITECLASS = args[2];
-            if (args.length > 3) {
-                LIBCORE_EXPECTATION_DIR = args[3];
+        if (args.length < 4 || args.length > 6) {
+            System.err.println("usage: CollectAllTests <output-file> <manifest-file> <jar-file> "
+                               + "<java-package> [expectation-dir [makefile-file]]");
+            if (args.length != 0) {
+                System.err.println("received:");
+                for (String arg : args) {
+                    System.err.println("  " + arg);
+                }
             }
-            if (args.length > 4) {
-                ANDROID_MAKE_FILE = args[4];
-            }
-        } else {
-            System.out.println("usage: \n" +
-                "\t... CollectAllTests <output-file> <manifest-file> <testsuite-class-name> <makefile-file> <expectation-dir>");
             System.exit(1);
         }
 
-        if (ANDROID_MAKE_FILE.length() > 0) {
-            testType = getTestType(ANDROID_MAKE_FILE);
-        }
+        final String outputPathPrefix = args[0];
+        File manifestFile = new File(args[1]);
+        String jarFileName = args[2];
+        final String javaPackageFilter = args[3];
+        String libcoreExpectationDir = (args.length > 4) ? args[4] : null;
+        String androidMakeFile = (args.length > 5) ? args[5] : null;
 
-        Document manifest = null;
+        final TestType testType = TestType.getTestType(androidMakeFile);
+
+        Document manifest;
         try {
-            manifest = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(MANIFESTFILE));
+            manifest = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
+                  new FileInputStream(manifestFile));
         } catch (Exception e) {
-            System.err.println("cannot open manifest");
+            System.err.println("cannot open manifest " + manifestFile);
             e.printStackTrace();
-            System.exit(1);;
+            System.exit(1);
+            return;
         }
 
         Element documentElement = manifest.getDocumentElement();
-
         documentElement.getAttribute("package");
+        final String runner = getElementAttribute(documentElement,
+                                                  "instrumentation",
+                                                  "android:name");
+        final String packageName = documentElement.getAttribute("package");
+        final String target = getElementAttribute(documentElement,
+                                                  "instrumentation",
+                                                  "android:targetPackage");
 
-        xmlName = new File(OUTPUTFILE).getName();
-        runner = getElementAttribute(documentElement, "instrumentation", "android:name");
-        packageName = documentElement.getAttribute("package");
-        target = getElementAttribute(documentElement, "instrumentation", "android:targetPackage");
-
-        Class<?> testClass = null;
+        String outputXmlFile = outputPathPrefix + ".xml";
+        final String xmlName = new File(outputPathPrefix).getName();
+        XMLGenerator xmlGenerator;
         try {
-            testClass = Class.forName(TESTSUITECLASS);
-        } catch (ClassNotFoundException e) {
-            System.err.println("test class not found");
-            e.printStackTrace();
-            System.exit(1);;
-        }
+            xmlGenerator = new XMLGenerator(outputXmlFile) {
+                {
+                    Node testPackageElem = mDoc.getDocumentElement();
 
-        Method method = null;
-        try {
-            method = testClass.getMethod("suite", new Class<?>[0]);
-        } catch (SecurityException e) {
-            System.err.println("failed to get suite method");
-            e.printStackTrace();
-            System.exit(1);;
-        } catch (NoSuchMethodException e) {
-            System.err.println("failed to get suite method");
-            e.printStackTrace();
-            System.exit(1);;
-        }
+                    setAttribute(testPackageElem, ATTRIBUTE_NAME, xmlName);
+                    setAttribute(testPackageElem, ATTRIBUTE_RUNNER, runner);
+                    setAttribute(testPackageElem, ATTRIBUTE_PACKAGE, packageName);
+                    setAttribute(testPackageElem, ATTRIBUTE_NS, packageName);
+                    setAttribute(testPackageElem, ATTRIBUTE_JAVA_PACKAGE_FILTER, javaPackageFilter);
 
-        try {
-            TESTSUITE = (Test) method.invoke(null, (Object[])null);
-        } catch (IllegalArgumentException e) {
-            System.err.println("failed to get suite method");
-            e.printStackTrace();
-            System.exit(1);;
-        } catch (IllegalAccessException e) {
-            System.err.println("failed to get suite method");
-            e.printStackTrace();
-            System.exit(1);;
-        } catch (InvocationTargetException e) {
-            System.err.println("failed to get suite method");
-            e.printStackTrace();
-            System.exit(1);;
-        }
+                    if (testType.type == TestType.HOST_SIDE_ONLY) {
+                        setAttribute(testPackageElem, ATTRIBUTE_HOST_SIDE_ONLY, "true");
+                        setAttribute(testPackageElem, ATTRIBUTE_JAR_PATH, testType.jarPath);
+                    }
 
-        try {
-            xmlGenerator = new MyXMLGenerator(OUTPUTFILE + ".xml");
+                    if (testType.type == TestType.VM_HOST_TEST) {
+                        setAttribute(testPackageElem, ATTRIBUTE_VM_HOST_TEST, "true");
+                        setAttribute(testPackageElem, ATTRIBUTE_JAR_PATH, testType.jarPath);
+                    }
+
+                    if (!packageName.equals(target)) {
+                        setAttribute(testPackageElem, ATTRIBUTE_TARGET, target);
+                        setAttribute(testPackageElem, ATTRIBUTE_TARGET_BINARY, target);
+                    }
+                }
+            };
         } catch (ParserConfigurationException e) {
-            System.err.println("Can't initialize XML Generator");
+            System.err.println("Can't initialize XML Generator " + outputXmlFile);
             System.exit(1);
+            return;
         }
 
+        ExpectationStore libcoreVogarExpectationStore;
+        ExpectationStore ctsVogarExpectationStore;
+
         try {
-            libcoreVogarExpectationStore = VogarUtils.provideExpectationStore(LIBCORE_EXPECTATION_DIR);
+            libcoreVogarExpectationStore
+                    = VogarUtils.provideExpectationStore(libcoreExpectationDir);
             ctsVogarExpectationStore = VogarUtils.provideExpectationStore(CTS_EXPECTATION_DIR);
         } catch (IOException e) {
-            System.err.println("Can't initialize vogar expectation store");
+            System.err.println("Can't initialize vogar expectation store from "
+                               + libcoreExpectationDir);
             e.printStackTrace(System.err);
             System.exit(1);
+            return;
+        }
+        ExpectationStore[] expectations = new ExpectationStore[] {
+            libcoreVogarExpectationStore, ctsVogarExpectationStore
+        };
+
+        JarFile jarFile = null;
+        try {
+            jarFile = new JarFile(jarFileName);
+        } catch (Exception e) {
+            System.err.println("cannot open jarfile " + jarFileName);
+            e.printStackTrace();
+            System.exit(1);
         }
 
-        testCases = new LinkedHashMap<String, TestClass>();
-        CollectAllTests cat = new CollectAllTests();
-        cat.compose();
+        Map<String,TestClass> testCases = new LinkedHashMap<String, TestClass>();
 
-        if (!failed.isEmpty()) {
-            System.err.println("The following classes have no default constructor");
-            for (Iterator<String> iterator = failed.iterator(); iterator.hasNext();) {
-                String type = iterator.next();
-                System.err.println(type);
+        String javaPackagePrefix = javaPackageFilter.isEmpty() ? "" : (javaPackageFilter + ".");
+
+        Enumeration<JarEntry> jarEntries = jarFile.entries();
+        while (jarEntries.hasMoreElements()) {
+            JarEntry jarEntry = jarEntries.nextElement();
+            String name = jarEntry.getName();
+            if (!name.endsWith(".class")) {
+                continue;
             }
-            System.exit(1);
+            String className
+                    = name.substring(0, name.length() - ".class".length()).replace('/', '.');
+            if (!className.startsWith(javaPackagePrefix)) {
+                continue;
+            }
+            try {
+                Class<?> klass = Class.forName(className,
+                                               false,
+                                               CollectAllTests.class.getClassLoader());
+                if (!TestCase.class.isAssignableFrom(klass)) {
+                    continue;
+                }
+                if (Modifier.isAbstract(klass.getModifiers())) {
+                    continue;
+                }
+                if (!Modifier.isPublic(klass.getModifiers())) {
+                    continue;
+                }
+                try {
+                    klass.getConstructor(new Class<?>[] { String.class } );
+                    addToTests(expectations, testCases, klass.asSubclass(TestCase.class));
+                    continue;
+                } catch (NoSuchMethodException e) {
+                } catch (SecurityException e) {
+                    System.out.println("problem with class " + className);
+                    e.printStackTrace();
+                }
+                try {
+                    klass.getConstructor(new Class<?>[0]);
+                    addToTests(expectations, testCases, klass.asSubclass(TestCase.class));
+                    continue;
+                } catch (NoSuchMethodException e) {
+                } catch (SecurityException e) {
+                    System.out.println("problem with class " + className);
+                    e.printStackTrace();
+                }
+            } catch (ClassNotFoundException e) {
+                System.out.println("class not found " + className);
+                e.printStackTrace();
+                System.exit(1);
+            }
         }
 
         for (Iterator<TestClass> iterator = testCases.values().iterator(); iterator.hasNext();) {
@@ -225,31 +236,51 @@
         try {
             xmlGenerator.dump();
         } catch (Exception e) {
-            System.err.println("cannot dump xml");
+            System.err.println("cannot dump xml to " + outputXmlFile);
             e.printStackTrace();
             System.exit(1);
         }
     }
 
-    private static int getTestType(String makeFileName) {
+    private static class TestType {
+        private static final int HOST_SIDE_ONLY = 1;
+        private static final int DEVICE_SIDE_ONLY = 2;
+        private static final int VM_HOST_TEST = 3;
 
-        int type = DEVICE_SIDE_ONLY;
-        try {
-            BufferedReader reader = new BufferedReader(new FileReader(makeFileName));
-            String line;
+        private final int type;
+        private final String jarPath;
 
-            while ((line =reader.readLine())!=null) {
-                if (line.startsWith(TEST_TYPE)) {
-                    type = HOST_SIDE_ONLY;
-                } else if (line.startsWith(JAR_PATH)) {
-                    jarPath = line.substring(JAR_PATH.length(), line.length()).trim();
-                }
-            }
-            reader.close();
-        } catch (IOException e) {
+        private TestType (int type, String jarPath) {
+            this.type = type;
+            this.jarPath = jarPath;
         }
 
-        return type;
+        private static TestType getTestType(String makeFileName) {
+            if (makeFileName == null || makeFileName.isEmpty()) {
+                return new TestType(DEVICE_SIDE_ONLY, null);
+            }
+            int type = TestType.DEVICE_SIDE_ONLY;
+            String jarPath = null;
+            try {
+                BufferedReader reader = new BufferedReader(new FileReader(makeFileName));
+                String line;
+
+                while ((line =reader.readLine())!=null) {
+                    if (line.startsWith(TEST_TYPE)) {
+                        if (line.indexOf(ATTRIBUTE_VM_HOST_TEST) >= 0) {
+                            type = VM_HOST_TEST;
+                        } else {
+                            type = HOST_SIDE_ONLY;
+                        }
+                    } else if (line.startsWith(JAR_PATH)) {
+                        jarPath = line.substring(JAR_PATH.length(), line.length()).trim();
+                    }
+                }
+                reader.close();
+            } catch (IOException e) {
+            }
+            return new TestType(type, jarPath);
+        }
     }
 
     private static Element getElement(Element element, String tagName) {
@@ -261,7 +292,9 @@
         }
     }
 
-    private static String getElementAttribute(Element element, String elementName, String attributeName) {
+    private static String getElementAttribute(Element element,
+                                              String elementName,
+                                              String attributeName) {
         Element e = getElement(element, elementName);
         if (e != null) {
             return e.getAttribute(attributeName);
@@ -270,65 +303,32 @@
         }
     }
 
-    public void compose() {
-        TestRunner runner = new TestRunner() {
-            @Override
-            protected TestResult createTestResult() {
-                return new TestResult() {
-                    @Override
-                    protected void run(TestCase test) {
-                        addToTests(test);
-                    }
-                };
-            }
-
-            @Override
-            public TestResult doRun(Test test) {
-                return super.doRun(test);
-            }
-
-
-
-        };
-
-        runner.setPrinter(new ResultPrinter(System.out) {
-            @Override
-            protected void printFooter(TestResult result) {
-            }
-
-            @Override
-            protected void printHeader(long runTime) {
-            }
-        });
-        runner.doRun(TESTSUITE);
-    }
-
-    private String getKnownFailure(final Class<? extends TestCase> testClass,
+    private static String getKnownFailure(final Class<? extends TestCase> testClass,
             final String testName) {
         return getAnnotation(testClass, testName, KNOWN_FAILURE);
     }
 
-    private boolean isKnownFailure(final Class<? extends TestCase> testClass,
+    private static boolean isKnownFailure(final Class<? extends TestCase> testClass,
             final String testName) {
         return getAnnotation(testClass, testName, KNOWN_FAILURE) != null;
     }
 
-    private boolean isBrokenTest(final Class<? extends TestCase> testClass,
+    private static boolean isBrokenTest(final Class<? extends TestCase> testClass,
             final String testName)  {
         return getAnnotation(testClass, testName, BROKEN_TEST) != null;
     }
 
-    private boolean isSuppressed(final Class<? extends TestCase> testClass,
+    private static boolean isSuppressed(final Class<? extends TestCase> testClass,
             final String testName)  {
         return getAnnotation(testClass, testName, SUPPRESSED_TEST) != null;
     }
 
-    private boolean hasSideEffects(final Class<? extends TestCase> testClass,
+    private static boolean hasSideEffects(final Class<? extends TestCase> testClass,
             final String testName) {
         return getAnnotation(testClass, testName, SIDE_EFFECT) != null;
     }
 
-    private String getAnnotation(final Class<? extends TestCase> testClass,
+    private static String getAnnotation(final Class<? extends TestCase> testClass,
             final String testName, final String annotationName) {
         try {
             Method testMethod = testClass.getMethod(testName, (Class[])null);
@@ -354,46 +354,71 @@
 
             }
 
-        } catch (java.lang.NoSuchMethodException e) {
+        } catch (NoSuchMethodException e) {
         }
 
         return null;
     }
 
-    private void addToTests(TestCase test) {
-
-        String testClassName = test.getClass().getName();
-        String testName = test.getName();
-        String knownFailure = getKnownFailure(test.getClass(), testName);
-
-        if (isKnownFailure(test.getClass(), testName)) {
-            System.out.println("ignoring known failure: " + test);
-            return;
-        } else if (isBrokenTest(test.getClass(), testName)) {
-            System.out.println("ignoring broken test: " + test);
-            return;
-        } else if (isSuppressed(test.getClass(), testName)) {
-            System.out.println("ignoring suppressed test: " + test);
-            return;
-        } else if (hasSideEffects(test.getClass(), testName)) {
-            System.out.println("ignoring test with side effects: " + test);
-            return;
-        } else if (VogarUtils.isVogarKnownFailure(libcoreVogarExpectationStore, test.getClass().getName(), testName)) {
-            System.out.println("ignoring libcore expectation known failure: " + test);
-            return;
-        } else if (VogarUtils.isVogarKnownFailure(ctsVogarExpectationStore, test.getClass().getName(), testName)) {
-            System.out.println("ignoring cts expectation known failure: " + test);
-            return;
-        }
-
-        if (!testName.startsWith("test")) {
-            try {
-                test.runBare();
-            } catch (Throwable e) {
-                e.printStackTrace();
-                return;
+    private static void addToTests(ExpectationStore[] expectations,
+                                   Map<String,TestClass> testCases,
+                                   Class<? extends TestCase> test) {
+        Class testClass = test;
+        Set<String> testNames = new HashSet<String>();
+        while (TestCase.class.isAssignableFrom(testClass)) {
+            Method[] testMethods = testClass.getDeclaredMethods();
+            for (Method testMethod : testMethods) {
+                String testName = testMethod.getName();
+                if (testNames.contains(testName)) {
+                    continue;
+                }
+                if (!testName.startsWith("test")) {
+                    continue;
+                }
+                if (testMethod.getParameterTypes().length != 0) {
+                    continue;
+                }
+                if (!testMethod.getReturnType().equals(Void.TYPE)) {
+                    continue;
+                }
+                if (!Modifier.isPublic(testMethod.getModifiers())) {
+                    continue;
+                }
+                testNames.add(testName);
+                addToTests(expectations, testCases, test, testName);
             }
+            testClass = testClass.getSuperclass();
         }
+    }
+
+    private static void addToTests(ExpectationStore[] expectations,
+                                   Map<String,TestClass> testCases,
+                                   Class<? extends TestCase> test,
+                                   String testName) {
+
+        String testClassName = test.getName();
+        String knownFailure = getKnownFailure(test, testName);
+
+        if (isKnownFailure(test, testName)) {
+            System.out.println("ignoring known failure: " + test + "#" + testName);
+            return;
+        } else if (isBrokenTest(test, testName)) {
+            System.out.println("ignoring broken test: " + test + "#" + testName);
+            return;
+        } else if (isSuppressed(test, testName)) {
+            System.out.println("ignoring suppressed test: " + test + "#" + testName);
+            return;
+        } else if (hasSideEffects(test, testName)) {
+            System.out.println("ignoring test with side effects: " + test + "#" + testName);
+            return;
+        } else if (VogarUtils.isVogarKnownFailure(expectations,
+                                                  testClassName,
+                                                  testName)) {
+            System.out.println("ignoring expectation known failure: " + test
+                               + "#" + testName);
+            return;
+        }
+
         TestClass testClass = null;
         if (testCases.containsKey(testClassName)) {
             testClass = testCases.get(testClassName);
@@ -403,13 +428,5 @@
         }
 
         testClass.mCases.add(new TestMethod(testName, "", "", knownFailure, false, false));
-
-        try {
-            test.getClass().getConstructor(new Class<?>[0]);
-        } catch (SecurityException e) {
-            failed.add(test.getClass().getName());
-        } catch (NoSuchMethodException e) {
-            failed.add(test.getClass().getName());
-        }
     }
 }
diff --git a/tools/utils/VogarUtils.java b/tools/utils/VogarUtils.java
index 06b48c6..c7070a5 100644
--- a/tools/utils/VogarUtils.java
+++ b/tools/utils/VogarUtils.java
@@ -27,6 +27,17 @@
 
 public class VogarUtils {
 
+    public static boolean isVogarKnownFailure(ExpectationStore[] expectationStores,
+            final String testClassName,
+            final String testMethodName) {
+        for (ExpectationStore expectationStore : expectationStores) {
+            if (isVogarKnownFailure(expectationStore, testClassName, testMethodName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public static boolean isVogarKnownFailure(ExpectationStore expectationStore,
             final String testClassName,
             final String testMethodName) {
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 4daf48e..cff27e5 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -106,8 +106,15 @@
       packages.append(doc.GetAttr('TestPackage', 'appPackageName'))
 
     plan = tools.TestPlan(packages)
+    plan.Exclude(r'android\.core\.vm-tests-tf')
     plan.Exclude('android\.performance.*')
     self.__WritePlan(plan, 'CTS')
+
+    plan.Exclude('android\.core\.vm-tests')
+    plan.Exclude('android\.performance.*')
+    plan.Include(r'android\.core\.vm-tests-tf')
+    self.__WritePlan(plan, 'CTS-TF')
+
     plan.Exclude(r'android\.tests\.sigtest')
     plan.Exclude(r'android\.core.*')
     self.__WritePlan(plan, 'Android')
@@ -118,9 +125,14 @@
 
     plan = tools.TestPlan(packages)
     plan.Include(r'android\.core\.vm-tests')
+    plan.Exclude(r'android\.core\.vm-tests-tf')
     self.__WritePlan(plan, 'VM')
 
     plan = tools.TestPlan(packages)
+    plan.Include(r'android\.core\.vm-tests-tf')
+    self.__WritePlan(plan, 'VM-TF')
+
+    plan = tools.TestPlan(packages)
     plan.Include(r'android\.tests\.sigtest')
     self.__WritePlan(plan, 'Signature')
 
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
new file mode 100644
index 0000000..bfc47d7
--- /dev/null
+++ b/tools/vm-tests-tf/Android.mk
@@ -0,0 +1,111 @@
+# Copyright (C) 2011 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.
+
+LOCAL_PATH := $(call my-dir)
+
+define all-src-files
+$(patsubst ./%,%,$(shell cd $(LOCAL_PATH) && find src -name '*.java'))
+endef
+
+# buildutil java library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_TEST_TYPE := vmHostTest
+LOCAL_JAR_PATH := android.core.vm-tests-tf.jar
+
+LOCAL_SRC_FILES := $(call all-src-files)
+
+LOCAL_MODULE := cts-tf-dalvik-buildutil
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := dx dasm cfassembler
+LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+$(LOCAL_BUILT_MODULE): PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates)/classes
+
+TF_BUILD_UTIL_INTERMEDIATES_CLASSES := $(intermediates)/classes
+
+include $(CLEAR_VARS)
+
+LOCAL_IS_HOST_MODULE := true
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE := vm-tests-tf
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+GENERATED_FILES:=$(intermediates)/tests
+
+$(LOCAL_BUILT_MODULE): $(GENERATED_FILES)
+
+colon:= :
+empty:=
+space:= $(empty) $(empty)
+
+
+$(GENERATED_FILES): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
+$(GENERATED_FILES): PRIVATE_LIB_FOLDER := $(LOCAL_PATH)/lib
+$(GENERATED_FILES): PRIVATE_INTERMEDIATES := $(intermediates)/tests
+$(GENERATED_FILES): PRIVATE_INTERMEDIATES_MAIN_FILES := $(intermediates)/main_files
+$(GENERATED_FILES): PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES := $(intermediates)/hostjunit_files
+$(GENERATED_FILES): $(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar $(HOST_OUT_JAVA_LIBRARIES)/dasm.jar $(HOST_OUT_JAVA_LIBRARIES)/dx.jar $(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar
+
+	$(hide) mkdir -p $@
+	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit
+# generated and compile the host side junit tests
+	$(hide) java -cp $(subst $(space),$(colon),$^):$(HOST_JDK_TOOLS_JAR) util.build.BuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) $<:$(PRIVATE_LIB_FOLDER)/junit.jar:$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar $(PRIVATE_INTERMEDIATES_MAIN_FILES) $(TF_BUILD_UTIL_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
+	@echo "wrote generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
+INSTALLED_TESTS := $(dir $(LOCAL_INSTALLED_MODULE))../cts_dalviktests_tf/timestamp
+
+$(LOCAL_BUILT_MODULE):  $(INSTALLED_TESTS)
+
+$(INSTALLED_TESTS): PRIVATE_INTERMEDIATES := $(intermediates)/tests
+$(INSTALLED_TESTS): $(GENERATED_FILES) $(GENERATED_FILES)/dot/junit/dexcore.jar
+	$(hide) mkdir -p $(dir $@)tests
+	$(hide) $(ACP) -r $(PRIVATE_INTERMEDIATES)/dot $(dir $@)tests
+	@touch $@
+
+$(intermediates)/android.core.vm-tests-tf.jar: PRIVATE_INTERMEDIATES := $(intermediates)
+$(intermediates)/android.core.vm-tests-tf.jar: $(INSTALLED_TESTS)
+	$(hide) cd $(PRIVATE_INTERMEDIATES)/hostjunit_files/classes && \
+	zip -q -r ../../android.core.vm-tests-tf.jar . && \
+	cd -
+	$(hide) cd $(PRIVATE_INTERMEDIATES) && \
+	zip -q -r android.core.vm-tests-tf.jar tests && \
+	cd -
+	
+
+define get-class-path
+	$(TF_BUILD_UTIL_INTERMEDIATES_CLASSES)/$(strip $(1))
+endef
+
+define dex-classes
+	@mkdir -p $(dir $@)
+	@jar -cf $(dir $@)/$(notdir $@).jar $(addprefix -C $(1) ,$(2))
+	$(hide) $(DX) -JXms16M -JXmx768M \
+    --dex --output=$@ \
+    $(if $(NO_OPTIMIZE_DX), \
+        --no-optimize) \
+    $(dir $@)/$(notdir $@).jar
+    @rm -f $(dir $@)/$(notdir $@).jar
+endef
+
+$(call get-class-path,dot/junit/DxUtil.class) $(call get-class-path,dot/junit/DxAbstractMain.class):  $(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar $(DX)
+
+$(GENERATED_FILES)/dot/junit/dexcore.jar: $(call get-class-path,dot/junit/DxUtil.class) $(call get-class-path,dot/junit/DxAbstractMain.class)
+	$(call dex-classes,$(TF_BUILD_UTIL_INTERMEDIATES_CLASSES),dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
diff --git a/tools/vm-tests-tf/lib/junit.jar b/tools/vm-tests-tf/lib/junit.jar
new file mode 100644
index 0000000..674d71e
--- /dev/null
+++ b/tools/vm-tests-tf/lib/junit.jar
Binary files differ
diff --git a/tools/vm-tests-tf/src/dot/Main.java b/tools/vm-tests-tf/src/dot/Main.java
new file mode 100644
index 0000000..b7d2dc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/Main.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot;
+
+import dot.junit.AllTests;
+import junit.textui.TestRunner;
+
+/**
+ * Main class to run the jasmin tests.
+ */
+public class Main {
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            System.out.println("Running all tests...");
+            TestRunner.run(AllTests.suite());
+        } else {
+            System.out.println("Running selected tests...");
+            TestRunner.main(args);
+        }
+
+        Runtime.getRuntime().halt(0);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/AllTests.java b/tools/vm-tests-tf/src/dot/junit/AllTests.java
new file mode 100644
index 0000000..fd54824
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/AllTests.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+/**
+ * Listing of all the tests that are to be run.
+ */
+public class AllTests {
+    public static void run() {
+        TestRunner.main(new String[] {AllTests.class.getName()});
+    }
+
+    public static final Test suite() {
+        TestSuite suite = new TestSuite();
+        // tests all opcodes
+        suite.addTest(dot.junit.opcodes.AllTests.suite());
+        suite.addTest(dot.junit.verify.AllTests.suite());
+        suite.addTest(dot.junit.format.AllTests.suite());
+        return suite;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/DxAbstractMain.java b/tools/vm-tests-tf/src/dot/junit/DxAbstractMain.java
new file mode 100644
index 0000000..d40fb94
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/DxAbstractMain.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit;
+
+public class DxAbstractMain {
+    
+    static public void assertEquals(int expected, int actual) {
+        if (expected != actual) throw new RuntimeException("AssertionFailedError: not equals. Expected " + expected + " actual " + actual);
+    }
+    
+    static public void assertEquals(String message, int expected, int actual) {
+        if (expected != actual) throw new RuntimeException("AssertionFailedError: not equals: " + message + " Expected " + expected + " actual " + actual);
+    }
+    
+
+    static public void assertEquals(long expected, long actual) {
+        if (expected != actual) throw new RuntimeException("AssertionFailedError: not equals. Expected " + expected + " actual " + actual);
+    }
+
+    static public void assertEquals(double expected, double actual, double delta) {
+        if(!(Math.abs(expected-actual) <= delta)) throw new RuntimeException("AssertionFailedError: not within delta");
+    }
+    
+    static public void assertEquals(Object expected, Object actual) {
+        if (expected == null && actual == null)
+            return;
+        if (expected != null && expected.equals(actual))
+            return;
+        throw new RuntimeException("AssertionFailedError: not the same");
+    }
+    
+    static public void assertTrue(boolean condition) {
+        if (!condition) throw new RuntimeException("AssertionFailedError: condition was false");
+    }
+    
+    static public void assertFalse(boolean condition) {
+        if (condition) throw new RuntimeException("AssertionFailedError: condition was true");
+    }
+    
+    static public void assertNotNull(Object object) {
+        if (object == null) throw new RuntimeException("AssertionFailedError: object was null");
+    }
+    
+    static public void assertNull(Object object) {
+        if (object != null) throw new RuntimeException("AssertionFailedError: object was not null");
+    }
+    
+    static public void fail(String message) {
+        throw new RuntimeException("AssertionFailedError msg:"+message);
+    }
+    
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/DxTestCase.java b/tools/vm-tests-tf/src/dot/junit/DxTestCase.java
new file mode 100644
index 0000000..00eb6fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/DxTestCase.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit;
+
+import junit.framework.TestCase;
+
+public class DxTestCase extends TestCase {
+    
+    // omit the "extends TestCase" and uncomment the following methods if you would like to run the tests as rolled-out, separate tests.
+    
+/*    
+    static public void assertEquals(int expected, int actual) {
+        if (expected != actual) throw new RuntimeException("AssertionFailedError: not equals");
+    }
+
+    static public void assertEquals(long expected, long actual) {
+        if (expected != actual) throw new RuntimeException("AssertionFailedError: not equals");
+    }
+
+    static public void assertEquals(double expected, double actual, double delta) {
+        if(!(Math.abs(expected-actual) <= delta)) throw new RuntimeException("AssertionFailedError: not within delta");
+    }
+    
+    static public void assertEquals(Object expected, Object actual) {
+        if (expected == null && actual == null)
+            return;
+        if (expected != null && expected.equals(actual))
+            return;
+        throw new RuntimeException("AssertionFailedError: not the same");
+    }
+    
+    static public void assertTrue(boolean condition) {
+        if (!condition) throw new RuntimeException("AssertionFailedError: condition was false");
+    }
+    
+    static public void assertFalse(boolean condition) {
+        if (condition) throw new RuntimeException("AssertionFailedError: condition was true");
+    }
+    
+    static public void assertNotNull(Object object) {
+        if (object == null) throw new RuntimeException("AssertionFailedError: object was null");
+    }
+    
+    static public void assertNull(Object object) {
+        if (object != null) throw new RuntimeException("AssertionFailedError: object was not null");
+    }
+    
+    static public void fail(String message) {
+        throw new RuntimeException("AssertionFailedError msg:"+message);
+    }
+*/    
+    
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/DxUtil.java b/tools/vm-tests-tf/src/dot/junit/DxUtil.java
new file mode 100644
index 0000000..cba0d54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/DxUtil.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit; 
+
+public class DxUtil {
+    private static boolean isDalvik = false;
+    
+    static {
+        /**
+         * whether in case of a failure, also ClassNotFoundException is accepted.
+         * this makes sense for invalid classes that got rejected by the dx tools
+         * and thus do not exist in .dex format, so that this class missing means a
+         * the expected verify error (though at the dx tool level)
+         */
+//        String acnfS = System.getProperty("acceptCNF");
+//        isDalvik = (acnfS != null && acnfS.equals("true"));
+        //System.out.println("@DX:DxUtil:isDalik="+isDalvik);
+    }
+    
+    public static void checkVerifyException(Throwable t) {
+        // the dalvik vm and other vm handle verify errors differently (see the dalvik verifier)
+        // the dalvik vm only throws a VerifyError, whereas other vm can throw all subclasses of
+        // LinkageError:
+        // - ClassCircularityError
+        // - ClassFormatError
+        // - ExceptionInInitializerError
+        // - IncompatibleClassChangeError
+        // - NoClassDefFoundError
+        // - UnsatisfiedLinkError
+        // - VerifyError
+
+        // in case we are testing the dalvik, we also accept a ClassNotFoundException, 
+        // since that may happen when a verify error was thrown by the dx tool and thus no
+        // classes.dex was written at all. 
+        //System.out.println("@dx:debug:isDalvik:"+isDalvik);
+        /*
+        if ((t instanceof VerifyError || 
+                (isDalvik && t instanceof ClassNotFoundException) || 
+                (!isDalvik && !(t instanceof NoClassDefFoundError) 
+                        && t instanceof LinkageError))) {
+                // ok, this is what we expected
+            System.out.println("@dx:debug:vfe-ok: vfe was:"+t.getClass().getName()+", msg:"+t.getMessage());
+            return;
+        } else {
+            throw new RuntimeException("test did not cause the expected verify error, but:"+t.getClass().getName()+", msg:"+t.getMessage());
+        }
+*/
+        if (t instanceof VerifyError || t instanceof java.lang.IncompatibleClassChangeError ||t instanceof ClassNotFoundException) {
+                // ok, this is what we expected
+        } else {
+            throw new RuntimeException("VerifyError expected", t);
+        }
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/format/AllTests.java b/tools/vm-tests-tf/src/dot/junit/format/AllTests.java
new file mode 100644
index 0000000..30cc091
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/AllTests.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.format;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+/**
+ * Listing of all the tests that are to be run.
+ */
+public class AllTests {
+
+    public static void run() {
+        TestRunner.main(new String[] {AllTests.class.getName()});
+    }
+
+    public static final Test suite() {
+        TestSuite suite = new TestSuite("Tests for dalvik vm: test that "
+                + "structurally damaged files are rejected by the verifier");
+        suite.addTestSuite(dot.junit.format.f1.Test_f1.class);
+
+        return suite;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/Test_f1.java b/tools/vm-tests-tf/src/dot/junit/format/f1/Test_f1.java
new file mode 100644
index 0000000..7751833
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/Test_f1.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.format.f1;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_f1 extends DxTestCase {
+
+    /**
+     * @constraint n/a
+     * @title size of dex file shall be greater than size of header 
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a 
+     * @title check that .dex with wrong magic is rejected 
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title check that .dex with wrong version is rejected 
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title check that .dex with wrong endian_tag is rejected 
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title check that .dex with wrong header size is rejected 
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title  file length must be equal to length in header
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title  header->map_off != 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title number of classes in dex shall be > 0
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title check that .dex with wrong checksum is rejected 
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_9");
+            fail("expected a verification exception but this test may fail if this check is not enforced");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title check that .dex with wrong signature is rejected 
+     */
+//    public void testVFE10() {
+//        try {
+//            Class.forName("dot.junit.format.f1.d.T_f1_10");
+//            fail("expected a verification exception but this test may fail if this check is not enforced");
+//        } catch (Throwable t) {
+//            DxUtil.checkVerifyException(t);
+//        }
+//    }
+    
+    /**
+     * @constraint n/a
+     * @title header and map section mismatch 
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title overlapping sections 
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.format.f1.d.T_f1_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_0.java b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_0.java
new file mode 100644
index 0000000..dda0585
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_0.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.format.f1.d;
+
+/**
+*
+*/
+public class T_f1_0 {
+   // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.d
new file mode 100644
index 0000000..e674f34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_1.java
+.class public dot.junit.format.f1.d.T_f1_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.dfh
new file mode 100644
index 0000000..9f57983
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_1.dfh
@@ -0,0 +1,50 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_1.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_1.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : ec6e3629
+    29 36 6E EC 
+// parsed: offset 12, len 20: signature           : 3861...369f
+    38 61 EF D2 97 82 DF F7 A7 77 7B 79 71 13 35 C5 6D 3E 36 9F 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.d
new file mode 100644
index 0000000..c06a20e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_10.java
+.class public dot.junit.format.f1.d.T_f1_10
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.dfh
new file mode 100644
index 0000000..302ade9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_10.dfh
@@ -0,0 +1,250 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_10.dex'...
+//@leaveSignature
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 847035e6
+    E6 35 70 84 
+// parsed: offset 12, len 20: signature           : 3812...2763
+//@mod    38 12 0A DA E3 92 55 8C 6E 8F 55 E2 13 CF 5C C2 93 C5 27 63 
+    38 12 0A DA E3 92 55 8C 6E 8F 55 E2 13 CF 5C C2 93 C5 27 64 
+// parsed: offset 32, len 4: file_size           : 504
+    F8 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 380 (0x00017c)
+    7C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 288
+    20 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_10;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 321 (0x000141) "Ljava/lang/Object;"
+    41 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 341 (0x000155) "T_f1_10.java"
+    55 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 355 (0x000163) "V"
+    63 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 358 (0x000166) "run"
+    66 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_10;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 363 (0x00016b)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 6B 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_10.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_10.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 33: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_10;"
+    1F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 31 30 3B 00 
+// parsed: offset 321, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 341, len 14: TYPE_STRING_DATA_ITEM [3] "T_f1_10.java"
+    0C 54 5F 66 31 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 355, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 358, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_10;"
+    // parsed: offset 363, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 364, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 365, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 366, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 367, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 368, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 371, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 373, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 374, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 375, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 377, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 380, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 384, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 396, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 408, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 420, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 432, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 444, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 456, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 468, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 480, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 363 (0x00016b)
+        00 20 00 00 01 00 00 00 6B 01 00 00 
+    // parsed: offset 492, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 380 (0x00017c)
+        00 10 00 00 01 00 00 00 7C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.d
new file mode 100644
index 0000000..4ad888f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_11.java
+.class public dot.junit.format.f1.d.T_f1_11
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.dfh
new file mode 100644
index 0000000..520eecd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_11.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 759b34c5
+    C5 34 9B 75 
+// parsed: offset 12, len 20: signature           : 4b4b...0a08
+    4B 4B CE BA CF CF BB 48 3B 6A 80 1B 8A C6 11 04 21 E0 0A 08 
+// parsed: offset 32, len 4: file_size           : 504
+    F8 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 380 (0x00017c)
+    7C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+//@mod    B8 00 00 00 
+    BA 00 00 00 
+// parsed: offset 104, len 4: data_size           : 288
+    20 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_11;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 321 (0x000141) "Ljava/lang/Object;"
+    41 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 341 (0x000155) "T_f1_11.java"
+    55 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 355 (0x000163) "V"
+    63 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 358 (0x000166) "run"
+    66 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_11;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 363 (0x00016b)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 6B 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_11.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_11.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 33: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_11;"
+    1F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 31 31 3B 00 
+// parsed: offset 321, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 341, len 14: TYPE_STRING_DATA_ITEM [3] "T_f1_11.java"
+    0C 54 5F 66 31 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 355, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 358, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_11;"
+    // parsed: offset 363, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 364, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 365, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 366, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 367, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 368, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 371, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 373, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 374, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 375, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 377, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 380, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 384, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 396, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 408, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 420, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 432, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 444, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 456, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 468, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 480, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 363 (0x00016b)
+        00 20 00 00 01 00 00 00 6B 01 00 00 
+    // parsed: offset 492, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 380 (0x00017c)
+        00 10 00 00 01 00 00 00 7C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.d
new file mode 100644
index 0000000..e6e053d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_12.java
+.class public dot.junit.format.f1.d.T_f1_12
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.dfh
new file mode 100644
index 0000000..4676340
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_12.dfh
@@ -0,0 +1,250 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_12.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 07303496
+    96 34 30 07 
+// parsed: offset 12, len 20: signature           : 100a...7239
+    10 0A 39 C5 D2 93 06 FC 06 5B 53 BC 09 9C 40 BB 95 77 72 39 
+// parsed: offset 32, len 4: file_size           : 504
+    F8 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 380 (0x00017c)
+    7C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+//@mod    B8 00 00 00 
+    A8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 288
+    20 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_12;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 321 (0x000141) "Ljava/lang/Object;"
+    41 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 341 (0x000155) "T_f1_12.java"
+    55 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 355 (0x000163) "V"
+    63 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 358 (0x000166) "run"
+    66 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_12;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 363 (0x00016b)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 6B 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_12.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_12.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 33: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_12;"
+    1F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 31 32 3B 00 
+// parsed: offset 321, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 341, len 14: TYPE_STRING_DATA_ITEM [3] "T_f1_12.java"
+    0C 54 5F 66 31 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 355, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 358, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_12;"
+    // parsed: offset 363, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 364, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 365, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 366, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 367, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 368, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 371, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 373, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 374, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 375, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 377, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 380, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 384, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 396, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 408, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 420, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 432, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 444, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+//@mod        06 00 00 00 01 00 00 00 B8 00 00 00 
+        06 00 00 00 01 00 00 00 A8 00 00 00 
+    // parsed: offset 456, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 468, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 480, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 363 (0x00016b)
+        00 20 00 00 01 00 00 00 6B 01 00 00 
+    // parsed: offset 492, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 380 (0x00017c)
+        00 10 00 00 01 00 00 00 7C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.d
new file mode 100644
index 0000000..72ed9ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_2.java
+.class public dot.junit.format.f1.d.T_f1_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.dfh
new file mode 100644
index 0000000..8bb38ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_2.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_2.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+//@mod    64 65 78 0A 30 33 35 00 
+    64 66 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 8bce34e8
+    E8 34 CE 8B 
+// parsed: offset 12, len 20: signature           : f886...8932
+    F8 86 A3 17 14 FD 2D 49 29 6D D9 46 AA 4F 13 EF AE 3E 89 32 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_2;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_2.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_2;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_2.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_2.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_2;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 32 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_2.java"
+    0B 54 5F 66 31 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_2;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.d
new file mode 100644
index 0000000..f98d9fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_3.java
+.class public dot.junit.format.f1.d.T_f1_3
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.dfh
new file mode 100644
index 0000000..cdfa4a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_3.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_3.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+//@mod    64 65 78 0A 30 33 35 00 
+    64 65 78 0A 30 33 36 00 
+// parsed: offset 8, len 4: checksum            : df0f35a3
+    A3 35 0F DF 
+// parsed: offset 12, len 20: signature           : b564...1b93
+    B5 64 17 3D FC 6E 3C 3F 82 57 DF 8D 9C A7 73 4C A9 DF 1B 93 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_3;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_3.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_3;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_3.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_3.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_3;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 33 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_3.java"
+    0B 54 5F 66 31 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_3;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.d
new file mode 100644
index 0000000..22611e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_4.java
+.class public dot.junit.format.f1.d.T_f1_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.dfh
new file mode 100644
index 0000000..ea0b607
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_4.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_4.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 64f33679
+    79 36 F3 64 
+// parsed: offset 12, len 20: signature           : 8406...c8ea
+    84 06 E5 69 3D 66 48 AB 94 79 27 C2 C1 ED 00 D7 F5 13 C8 EA 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+//@mod    78 56 34 12 
+    78 56 12 34 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_4;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_4.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_4;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_4.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_4.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_4;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 34 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_4.java"
+    0B 54 5F 66 31 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_4;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.d
new file mode 100644
index 0000000..e3a993f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_5.java
+.class public dot.junit.format.f1.d.T_f1_5
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.dfh
new file mode 100644
index 0000000..99ffd13
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_5.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_5.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_5.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 76133706
+    06 37 13 76 
+// parsed: offset 12, len 20: signature           : 8bbd...7aa2
+    8B BD 3B 72 62 F4 A2 15 DF 5E D8 E5 D2 AE 88 0D 4F B2 7A A2 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+//@mod    70 00 00 00 
+    69 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_5;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_5.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_5;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_5;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_5.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_5.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_5.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_5;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 35 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_5.java"
+    0B 54 5F 66 31 5F 35 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_5;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.d
new file mode 100644
index 0000000..6bb0bf0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_6.java
+.class public dot.junit.format.f1.d.T_f1_6
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.dfh
new file mode 100644
index 0000000..375a9ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_6.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_6.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_6.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 9bbb37a1
+    A1 37 BB 9B 
+// parsed: offset 12, len 20: signature           : a799...4c32
+    A7 99 F8 99 E8 8A 81 65 99 13 A3 2A E4 F9 F2 75 BD A6 4C 32 
+// parsed: offset 32, len 4: file_size           : 500
+//@mod    F4 01 00 00 
+    F4 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_6;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_6.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_6;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_6;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_6.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_6.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_6.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_6;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 36 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_6.java"
+    0B 54 5F 66 31 5F 36 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_6;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.d
new file mode 100644
index 0000000..61f31b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_7.java
+.class public dot.junit.format.f1.d.T_f1_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.dfh
new file mode 100644
index 0000000..1845c7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_7.dfh
@@ -0,0 +1,249 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_7.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_7.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 6b8435f0
+    F0 35 84 6B 
+// parsed: offset 12, len 20: signature           : a4f8...a536
+    A4 F8 18 65 4B 3E B6 D4 7A 69 71 CE B6 43 71 42 D3 6C A5 36 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+//@mod    78 01 00 00 
+    00 00 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_7;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_7.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_7;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_7;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_7.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_7.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_7.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_7;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 37 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_7.java"
+    0B 54 5F 66 31 5F 37 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_7;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.d
new file mode 100644
index 0000000..c622eb0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_8.java
+.class public dot.junit.format.f1.d.T_f1_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.dfh
new file mode 100644
index 0000000..3ebff78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_8.dfh
@@ -0,0 +1,251 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : bd8b37bf
+    BF 37 8B BD 
+// parsed: offset 12, len 20: signature           : 1091...62b1
+    10 91 A3 C7 70 2E 36 E5 FD 30 D9 9A 80 EE 8A CC EC BA 62 B1 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+//@mod    01 00 00 00 
+    00 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_8;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_8.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_8;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+//@mod    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_8.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_8.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_8;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 38 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_8.java"
+    0B 54 5F 66 31 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_8;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+//@mod        06 00 00 00 01 00 00 00 B8 00 00 00 
+        06 00 00 00 00 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.d b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.d
new file mode 100644
index 0000000..9a44f4e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_f1_9.java
+.class public dot.junit.format.f1.d.T_f1_9
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       nop
+       nop
+       nop
+       nop
+       const v2, 456
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.dfh b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.dfh
new file mode 100644
index 0000000..f3e4dd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/format/f1/d/T_f1_9.dfh
@@ -0,0 +1,250 @@
+// Processing 'out/classes_dasm/dot/junit/format/f1/d/T_f1_9.dex'...
+//@leaveChecksum
+// Opened 'out/classes_dasm/dot/junit/format/f1/d/T_f1_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a9763611
+//@mod    11 36 76 A9 
+    11 36 76 AA 
+// parsed: offset 12, len 20: signature           : 1ee9...1036
+    1E E9 E9 EC 3D 14 5F 07 A1 FA 8E E8 B1 FA 6C 91 35 6A 10 36 
+// parsed: offset 32, len 4: file_size           : 500
+    F4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 376 (0x000178)
+    78 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 284
+    1C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 280 (0x000118) "<init>"
+    18 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 288 (0x000120) "Ldot/junit/format/f1/d/T_f1_9;"
+    20 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 320 (0x000140) "Ljava/lang/Object;"
+    40 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 340 (0x000154) "T_f1_9.java"
+    54 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 353 (0x000161) "V"
+    61 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 356 (0x000164) "run"
+    64 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/format/f1/d/T_f1_9;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/format/f1/d/T_f1_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_f1_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 361 (0x000169)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 69 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_9.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.format.f1.d.T_f1_9.run"
+    // parsed: offset 240, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: const v0, #float 0.000000 // #0x0000007b int
+            14 00 7B 00 00 00 
+        // parsed: offset 262, len 2: |0003: nop // spacer
+            00 00 
+        // parsed: offset 264, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 266, len 2: |0005: nop // spacer
+            00 00 
+        // parsed: offset 268, len 2: |0006: nop // spacer
+            00 00 
+        // parsed: offset 270, len 6: |0007: const v2, #float 0.000000 // #0x000001c8 int
+            14 02 C8 01 00 00 
+        // parsed: offset 276, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 278, len 2: PADDING
+    00 00 
+// parsed: offset 280, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 288, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/format/f1/d/T_f1_9;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 66 6F 72 6D 61 74 2F 66 31 2F 64 2F 54 5F 66 31 5F 39 3B 00 
+// parsed: offset 320, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 340, len 13: TYPE_STRING_DATA_ITEM [3] "T_f1_9.java"
+    0B 54 5F 66 31 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 353, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 356, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/format/f1/d/T_f1_9;"
+    // parsed: offset 361, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 362, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 363, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 364, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 365, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 366, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 369, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 371, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 372, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 373, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 375, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 376, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 380, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 392, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 404, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 416, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 428, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 440, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 452, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 464, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 280 (0x000118)
+        02 20 00 00 06 00 00 00 18 01 00 00 
+    // parsed: offset 476, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 361 (0x000169)
+        00 20 00 00 01 00 00 00 69 01 00 00 
+    // parsed: offset 488, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 376 (0x000178)
+        00 10 00 00 01 00 00 00 78 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/AllTests.java b/tools/vm-tests-tf/src/dot/junit/opcodes/AllTests.java
new file mode 100644
index 0000000..282ac42
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/AllTests.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+/**
+ * Listing of all the tests that are to be run.
+ */
+public class AllTests {
+
+    public static void run() {
+        TestRunner.main(new String[] {AllTests.class.getName()});
+    }
+
+    public static final Test suite() {
+        TestSuite suite = new TestSuite("Tests for all dalvik vm opcodes");
+        suite.addTestSuite(dot.junit.opcodes.add_double_2addr.Test_add_double_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.add_double.Test_add_double.class);
+        suite.addTestSuite(dot.junit.opcodes.add_float_2addr.Test_add_float_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.add_float.Test_add_float.class);
+        suite.addTestSuite(dot.junit.opcodes.add_int_2addr.Test_add_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.add_int_lit16.Test_add_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.add_int_lit8.Test_add_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.add_int.Test_add_int.class);
+        suite.addTestSuite(dot.junit.opcodes.add_long_2addr.Test_add_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.add_long.Test_add_long.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_boolean.Test_aget_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_byte.Test_aget_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_char.Test_aget_char.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_object.Test_aget_object.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_short.Test_aget_short.class);
+        suite.addTestSuite(dot.junit.opcodes.aget.Test_aget.class);
+        suite.addTestSuite(dot.junit.opcodes.aget_wide.Test_aget_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.and_int_2addr.Test_and_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.and_int_lit16.Test_and_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.and_int_lit8.Test_and_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.and_int.Test_and_int.class);
+        suite.addTestSuite(dot.junit.opcodes.and_long_2addr.Test_and_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.and_long.Test_and_long.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_boolean.Test_aput_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_byte.Test_aput_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_char.Test_aput_char.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_object.Test_aput_object.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_short.Test_aput_short.class);
+        suite.addTestSuite(dot.junit.opcodes.aput.Test_aput.class);
+        suite.addTestSuite(dot.junit.opcodes.aput_wide.Test_aput_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.array_length.Test_array_length.class);
+        suite.addTestSuite(dot.junit.opcodes.check_cast.Test_check_cast.class);
+        suite.addTestSuite(dot.junit.opcodes.cmpg_double.Test_cmpg_double.class);
+        suite.addTestSuite(dot.junit.opcodes.cmpg_float.Test_cmpg_float.class);
+        suite.addTestSuite(dot.junit.opcodes.cmpl_double.Test_cmpl_double.class);
+        suite.addTestSuite(dot.junit.opcodes.cmpl_float.Test_cmpl_float.class);
+        suite.addTestSuite(dot.junit.opcodes.cmp_long.Test_cmp_long.class);
+        suite.addTestSuite(dot.junit.opcodes.const_16.Test_const_16.class);
+        suite.addTestSuite(dot.junit.opcodes.const_4.Test_const_4.class);
+        suite.addTestSuite(dot.junit.opcodes.const_class.Test_const_class.class);
+        suite.addTestSuite(dot.junit.opcodes.const_high16.Test_const_high16.class);
+        suite.addTestSuite(dot.junit.opcodes.const_string_jumbo.Test_const_string_jumbo.class);
+        suite.addTestSuite(dot.junit.opcodes.const_string.Test_const_string.class);
+        suite.addTestSuite(dot.junit.opcodes.const_wide_16.Test_const_wide_16.class);
+        suite.addTestSuite(dot.junit.opcodes.const_wide_32.Test_const_wide_32.class);
+        suite.addTestSuite(dot.junit.opcodes.const_wide_high16.Test_const_wide_high16.class);
+        suite.addTestSuite(dot.junit.opcodes.const_wide.Test_const_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.div_double_2addr.Test_div_double_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.div_double.Test_div_double.class);
+        suite.addTestSuite(dot.junit.opcodes.div_float_2addr.Test_div_float_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.div_float.Test_div_float.class);
+        suite.addTestSuite(dot.junit.opcodes.div_int_2addr.Test_div_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.div_int_lit16.Test_div_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.div_int_lit8.Test_div_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.div_int.Test_div_int.class);
+        suite.addTestSuite(dot.junit.opcodes.div_long_2addr.Test_div_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.div_long.Test_div_long.class);
+        suite.addTestSuite(dot.junit.opcodes.double_to_float.Test_double_to_float.class);
+        suite.addTestSuite(dot.junit.opcodes.double_to_int.Test_double_to_int.class);
+        suite.addTestSuite(dot.junit.opcodes.double_to_long.Test_double_to_long.class);
+        suite.addTestSuite(dot.junit.opcodes.fill_array_data.Test_fill_array_data.class);
+        suite.addTestSuite(dot.junit.opcodes.filled_new_array_range.Test_filled_new_array_range.class);
+        suite.addTestSuite(dot.junit.opcodes.filled_new_array.Test_filled_new_array.class);
+        suite.addTestSuite(dot.junit.opcodes.float_to_double.Test_float_to_double.class);
+        suite.addTestSuite(dot.junit.opcodes.float_to_int.Test_float_to_int.class);
+        suite.addTestSuite(dot.junit.opcodes.float_to_long.Test_float_to_long.class);
+        suite.addTestSuite(dot.junit.opcodes.goto_16.Test_goto_16.class);
+        suite.addTestSuite(dot.junit.opcodes.goto_32.Test_goto_32.class);
+        suite.addTestSuite(dot.junit.opcodes.if_eq.Test_if_eq.class);
+        suite.addTestSuite(dot.junit.opcodes.if_eqz.Test_if_eqz.class);
+        suite.addTestSuite(dot.junit.opcodes.if_ge.Test_if_ge.class);
+        suite.addTestSuite(dot.junit.opcodes.if_gez.Test_if_gez.class);
+        suite.addTestSuite(dot.junit.opcodes.if_gt.Test_if_gt.class);
+        suite.addTestSuite(dot.junit.opcodes.if_gtz.Test_if_gtz.class);
+        suite.addTestSuite(dot.junit.opcodes.if_le.Test_if_le.class);
+        suite.addTestSuite(dot.junit.opcodes.if_lez.Test_if_lez.class);
+        suite.addTestSuite(dot.junit.opcodes.if_lt.Test_if_lt.class);
+        suite.addTestSuite(dot.junit.opcodes.if_ltz.Test_if_ltz.class);
+        suite.addTestSuite(dot.junit.opcodes.if_ne.Test_if_ne.class);
+        suite.addTestSuite(dot.junit.opcodes.if_nez.Test_if_nez.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_boolean.Test_iget_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_byte.Test_iget_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_char.Test_iget_char.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_object.Test_iget_object.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_short.Test_iget_short.class);
+        suite.addTestSuite(dot.junit.opcodes.iget.Test_iget.class);
+        suite.addTestSuite(dot.junit.opcodes.iget_wide.Test_iget_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.instance_of.Test_instance_of.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_byte.Test_int_to_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_char.Test_int_to_char.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_double.Test_int_to_double.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_float.Test_int_to_float.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_long.Test_int_to_long.class);
+        suite.addTestSuite(dot.junit.opcodes.int_to_short.Test_int_to_short.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_direct_range.Test_invoke_direct_range.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_direct.Test_invoke_direct.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_interface_range.Test_invoke_interface_range.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_interface.Test_invoke_interface.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_static_range.Test_invoke_static_range.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_static.Test_invoke_static.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_super_range.Test_invoke_super_range.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_super.Test_invoke_super.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_virtual_range.Test_invoke_virtual_range.class);
+        suite.addTestSuite(dot.junit.opcodes.invoke_virtual.Test_invoke_virtual.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_boolean.Test_iput_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_byte.Test_iput_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_char.Test_iput_char.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_object.Test_iput_object.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_short.Test_iput_short.class);
+        suite.addTestSuite(dot.junit.opcodes.iput.Test_iput.class);
+        suite.addTestSuite(dot.junit.opcodes.iput_wide.Test_iput_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.long_to_double.Test_long_to_double.class);
+        suite.addTestSuite(dot.junit.opcodes.long_to_float.Test_long_to_float.class);
+        suite.addTestSuite(dot.junit.opcodes.long_to_int.Test_long_to_int.class);
+        suite.addTestSuite(dot.junit.opcodes.monitor_enter.Test_monitor_enter.class);
+        suite.addTestSuite(dot.junit.opcodes.monitor_exit.Test_monitor_exit.class);
+        suite.addTestSuite(dot.junit.opcodes.move_16.Test_move_16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_exception.Test_move_exception.class);
+        suite.addTestSuite(dot.junit.opcodes.move_from16.Test_move_from16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_object_16.Test_move_object_16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_object_from16.Test_move_object_from16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_object.Test_move_object.class);
+        suite.addTestSuite(dot.junit.opcodes.move_result_object.Test_move_result_object.class);
+        suite.addTestSuite(dot.junit.opcodes.move_result.Test_move_result.class);
+        suite.addTestSuite(dot.junit.opcodes.move_result_wide.Test_move_result_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.move.Test_move.class);
+        suite.addTestSuite(dot.junit.opcodes.move_wide_16.Test_move_wide_16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_wide_from16.Test_move_wide_from16.class);
+        suite.addTestSuite(dot.junit.opcodes.move_wide.Test_move_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_double_2addr.Test_mul_double_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_double.Test_mul_double.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_float_2addr.Test_mul_float_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_float.Test_mul_float.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_int_2addr.Test_mul_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_int_lit16.Test_mul_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_int_lit8.Test_mul_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_int.Test_mul_int.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_long_2addr.Test_mul_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.mul_long.Test_mul_long.class);
+        suite.addTestSuite(dot.junit.opcodes.neg_double.Test_neg_double.class);
+        suite.addTestSuite(dot.junit.opcodes.neg_float.Test_neg_float.class);
+        suite.addTestSuite(dot.junit.opcodes.neg_int.Test_neg_int.class);
+        suite.addTestSuite(dot.junit.opcodes.neg_long.Test_neg_long.class);
+        suite.addTestSuite(dot.junit.opcodes.new_array.Test_new_array.class);
+        suite.addTestSuite(dot.junit.opcodes.new_instance.Test_new_instance.class);
+        suite.addTestSuite(dot.junit.opcodes.nop.Test_nop.class);
+        suite.addTestSuite(dot.junit.opcodes.not_int.Test_not_int.class);
+        suite.addTestSuite(dot.junit.opcodes.not_long.Test_not_long.class);
+        suite.addTestSuite(dot.junit.opcodes.opc_const.Test_opc_const.class);
+        suite.addTestSuite(dot.junit.opcodes.opc_goto.Test_opc_goto.class);
+        suite.addTestSuite(dot.junit.opcodes.opc_return.Test_opc_return.class);
+        suite.addTestSuite(dot.junit.opcodes.opc_throw.Test_opc_throw.class);
+        suite.addTestSuite(dot.junit.opcodes.or_int_2addr.Test_or_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.or_int_lit16.Test_or_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.or_int_lit8.Test_or_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.or_int.Test_or_int.class);
+        suite.addTestSuite(dot.junit.opcodes.or_long_2addr.Test_or_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.or_long.Test_or_long.class);
+        suite.addTestSuite(dot.junit.opcodes.packed_switch.Test_packed_switch.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_double_2addr.Test_rem_double_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_double.Test_rem_double.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_float_2addr.Test_rem_float_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_float.Test_rem_float.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_int_2addr.Test_rem_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_int_lit16.Test_rem_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_int_lit8.Test_rem_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_int.Test_rem_int.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_long_2addr.Test_rem_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.rem_long.Test_rem_long.class);
+        suite.addTestSuite(dot.junit.opcodes.return_object.Test_return_object.class);
+        suite.addTestSuite(dot.junit.opcodes.return_void.Test_return_void.class);
+        suite.addTestSuite(dot.junit.opcodes.return_wide.Test_return_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.rsub_int_lit8.Test_rsub_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.rsub_int.Test_rsub_int.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_boolean.Test_sget_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_byte.Test_sget_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_char.Test_sget_char.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_object.Test_sget_object.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_short.Test_sget_short.class);
+        suite.addTestSuite(dot.junit.opcodes.sget.Test_sget.class);
+        suite.addTestSuite(dot.junit.opcodes.sget_wide.Test_sget_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.shl_int_2addr.Test_shl_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.shl_int_lit8.Test_shl_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.shl_int.Test_shl_int.class);
+        suite.addTestSuite(dot.junit.opcodes.shl_long_2addr.Test_shl_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.shl_long.Test_shl_long.class);
+        suite.addTestSuite(dot.junit.opcodes.shr_int_2addr.Test_shr_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.shr_int_lit8.Test_shr_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.shr_int.Test_shr_int.class);
+        suite.addTestSuite(dot.junit.opcodes.shr_long_2addr.Test_shr_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.shr_long.Test_shr_long.class);
+        suite.addTestSuite(dot.junit.opcodes.sparse_switch.Test_sparse_switch.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_boolean.Test_sput_boolean.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_byte.Test_sput_byte.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_char.Test_sput_char.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_object.Test_sput_object.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_short.Test_sput_short.class);
+        suite.addTestSuite(dot.junit.opcodes.sput.Test_sput.class);
+        suite.addTestSuite(dot.junit.opcodes.sput_wide.Test_sput_wide.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_double_2addr.Test_sub_double_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_double.Test_sub_double.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_float_2addr.Test_sub_float_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_float.Test_sub_float.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_int_2addr.Test_sub_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_int.Test_sub_int.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_long_2addr.Test_sub_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.sub_long.Test_sub_long.class);
+        suite.addTestSuite(dot.junit.opcodes.ushr_int_2addr.Test_ushr_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.ushr_int_lit8.Test_ushr_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.ushr_int.Test_ushr_int.class);
+        suite.addTestSuite(dot.junit.opcodes.ushr_long_2addr.Test_ushr_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.ushr_long.Test_ushr_long.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_int_2addr.Test_xor_int_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_int_lit16.Test_xor_int_lit16.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_int_lit8.Test_xor_int_lit8.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_int.Test_xor_int.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_long_2addr.Test_xor_long_2addr.class);
+        suite.addTestSuite(dot.junit.opcodes.xor_long.Test_xor_long.class);      
+        return suite;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/Test_add_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/Test_add_double.java
new file mode 100644
index 0000000..8887d50
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/Test_add_double.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_double.d.T_add_double_1;
+import dot.junit.opcodes.add_double.d.T_add_double_3;
+
+public class Test_add_double extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(5.84d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(-3.14d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title Arguments = -3.14d, -2.7d
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.add_double.d.T_add_double_2
+        //@uses dot.junit.opcodes.add_double.d.T_add_double_3 
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(-5.84d, t.run(-3.14d, -2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this sum of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_add_double_3 t = new T_add_double_3();
+        try {
+            t.run();
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB4() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB5() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(+0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(-0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, 2.7d
+     */
+    public void testB7() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(+0d, t.run(-2.7d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.MAX_VALUE,
+                Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, -4.9E-324
+     */
+    public void testB9() {
+        T_add_double_1 t = new T_add_double_1();
+        assertEquals(0d, t.run(Double.MIN_VALUE, -4.9E-324));
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double.d.T_add_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double.d.T_add_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double.d.T_add_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double.d.T_add_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.d
new file mode 100644
index 0000000..f3d3653
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_1.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.java
new file mode 100644
index 0000000..530fbd2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double.d;
+
+public class T_add_double_1 {
+
+    public double run(double a, double b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_2.d
new file mode 100644
index 0000000..da30626
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       const v3, 3.1415
+       add-double v0, v3, v5
+       return-wide v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.d
new file mode 100644
index 0000000..ebdc492
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_3.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 7
+
+       const-wide v2, 31415
+       const-wide v4, 3.1415
+       add-double v0, v2, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.java
new file mode 100644
index 0000000..fadc09e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double.d;
+
+public class T_add_double_3 {
+
+    public double run() {
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_4.d
new file mode 100644
index 0000000..7acfdfd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_4.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double v0, v3, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_5.d
new file mode 100644
index 0000000..64b8613
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_5.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double v0, v3, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_6.d
new file mode 100644
index 0000000..424bd3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double/d/T_add_double_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_6.java
+.class public dot.junit.opcodes.add_double.d.T_add_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 7
+       move v0, v5
+       move v1, v5
+       move v2, v6    
+       move v3, v6    
+       add-double v0, v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java
new file mode 100644
index 0000000..f0a17a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_1;
+import dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_3;
+
+public class Test_add_double_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(5.84d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(-3.14d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title Arguments = -3.14d, -2.7d
+     */
+    public void testN3() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(-5.84d, t.run(-3.14d, -2.7d));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this sum of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_add_double_2addr_3 t = new T_add_double_2addr_3();
+        try {
+            t.run();
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB4() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB5() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(+0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(-0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, 2.7d
+     */
+    public void testB7() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(+0d, t.run(-2.7d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.MAX_VALUE,
+                Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, -4.9E-324
+     */
+    public void testB9() {
+        T_add_double_2addr_1 t = new T_add_double_2addr_1();
+        assertEquals(0d, t.run(Double.MIN_VALUE, -4.9E-324));
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d
new file mode 100644
index 0000000..44d1f78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_1.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java
new file mode 100644
index 0000000..33ac19a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double_2addr.d;
+
+public class T_add_double_2addr_1 {
+
+    public double run(double a, double b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d
new file mode 100644
index 0000000..3633e01
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_2.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       const v3, 3.1415
+       add-double/2addr v3, v5
+       return-wide v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d
new file mode 100644
index 0000000..62f4198
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_3.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 7
+
+       const-wide v2, 31415
+       const-wide v4, 3.1415
+       add-double/2addr v4, v2
+       return-wide v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java
new file mode 100644
index 0000000..860bfc9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_double_2addr.d;
+
+public class T_add_double_2addr_3 {
+
+    public double run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d
new file mode 100644
index 0000000..a9f2625
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_4.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double/2addr v3, v2
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d
new file mode 100644
index 0000000..521f02b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_5.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       add-double/2addr v3, v7
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d
new file mode 100644
index 0000000..cd95033
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_add_double_2addr_6.java
+.class public dot.junit.opcodes.add_double_2addr.d.T_add_double_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 7
+       move v0, v5
+          move v1, v5
+       move v2, v6
+          move v3, v6          
+       add-double/2addr v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/Test_add_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/Test_add_float.java
new file mode 100644
index 0000000..b821daa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/Test_add_float.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_float.d.T_add_float_1;
+import dot.junit.opcodes.add_float.d.T_add_float_5;
+
+public class Test_add_float extends DxTestCase {
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(5.84f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(-3.14f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title Arguments = -3.14f, -2.7f
+     */
+    public void testN3() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(-5.84f, t.run(-3.14f, -2.7f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_add_float_5 t = new T_add_float_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(3.3028235E38f, 0.11E38f));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_add_float_1 t = new T_add_float_1();
+        assertTrue(Float.isNaN(t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY)));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB4() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(+0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(-0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, 2.7f
+     */
+    public void testB7() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(+0f, t.run(-2.7f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB9() {
+        T_add_float_1 t = new T_add_float_1();
+        assertEquals(0f, t.run(Float.MIN_VALUE, -1.4E-45f));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float.d.T_add_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float.d.T_add_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float.d.T_add_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float.d.T_add_float_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.d
new file mode 100644
index 0000000..502b435
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_1.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.java
new file mode 100644
index 0000000..efe39a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float.d;
+
+public class T_add_float_1 {
+
+    public float run(float a, float b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_2.d
new file mode 100644
index 0000000..627036b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       const-wide v0, 3.1415    
+       add-float v0, v3, v0
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_3.d
new file mode 100644
index 0000000..7de8486
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_3.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       const-wide v0, 3141523
+       add-float v0, v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_4.d
new file mode 100644
index 0000000..443ed0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_4.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float v0, v2, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.d
new file mode 100644
index 0000000..efcd143
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_5.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 4
+       add-float v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.java
new file mode 100644
index 0000000..403a198
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float.d;
+
+public class T_add_float_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_6.d
new file mode 100644
index 0000000..061a4da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float/d/T_add_float_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_6.java
+.class public dot.junit.opcodes.add_float.d.T_add_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java
new file mode 100644
index 0000000..5824a70
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_1;
+import dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_5;
+
+public class Test_add_float_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(5.84f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(-3.14f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title Arguments = -3.14f, -2.7f
+     */
+    public void testN3() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(-5.84f, t.run(-3.14f, -2.7f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_add_float_2addr_5 t = new T_add_float_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(3.3028235E38f, 0.11E38f));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertTrue(Float.isNaN(t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY)));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB4() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(+0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(-0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, 2.7f
+     */
+    public void testB7() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(+0f, t.run(-2.7f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB9() {
+        T_add_float_2addr_1 t = new T_add_float_2addr_1();
+        assertEquals(0f, t.run(Float.MIN_VALUE, -1.4E-45f));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d
new file mode 100644
index 0000000..38344b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_1.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java
new file mode 100644
index 0000000..a872040
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float_2addr.d;
+
+public class T_add_float_2addr_1 {
+
+    public float run(float a, float b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d
new file mode 100644
index 0000000..dd35d2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_2.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       const-wide v0, 3.1415    
+       add-float/2addr v3, v0
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d
new file mode 100644
index 0000000..6c0eb9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_3.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       const-wide v0, 3141523
+       add-float/2addr v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d
new file mode 100644
index 0000000..c9832e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_4.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float/2addr v2, v1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d
new file mode 100644
index 0000000..281b673
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_5.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 4
+       add-float/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java
new file mode 100644
index 0000000..afdfb51
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_float_2addr.d;
+
+public class T_add_float_2addr_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d
new file mode 100644
index 0000000..2aa078c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_float_2addr_6.java
+.class public dot.junit.opcodes.add_float_2addr.d.T_add_float_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       add-float/2addr v2, v4
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/Test_add_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/Test_add_int.java
new file mode 100644
index 0000000..f952b82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/Test_add_int.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_int.d.T_add_int_1;
+import dot.junit.opcodes.add_int.d.T_add_int_5;
+
+public class Test_add_int extends DxTestCase {
+    /**
+     * @title Arguments = 8, 4 
+     */
+    public void testN1() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(12, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 0, 255
+     */
+    public void testN2() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(255, t.run(0, 255));
+    }
+
+    /**
+     * @title Arguments = 0, -65536
+     */
+    public void testN3() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(-65536, t.run(0, -65536));
+    }
+
+    /**
+     * @title Arguments = 0, -2147483647
+     */
+    public void testN4() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(-2147483647, t.run(0, -2147483647));
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe, 2
+     */
+    public void testN5() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(-2147483648, t.run(0x7ffffffe, 2));
+    }
+
+    /**
+     * @title Arguments = -1, 1
+     */
+    public void testN6() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(0, t.run(-1, 1));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_add_int_5 t = new T_add_int_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(-2, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB4() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(-2147483647, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_int_1 t = new T_add_int_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int.d.T_add_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int.d.T_add_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int.d.T_add_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int.d.T_add_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.d
new file mode 100644
index 0000000..bd71e35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_1.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.java
new file mode 100644
index 0000000..6b9c617
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int.d;
+
+public class T_add_int_1 {
+
+    public int run(int a, int b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_2.d
new file mode 100644
index 0000000..83cb90c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       add-int v0, v2, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_3.d
new file mode 100644
index 0000000..84db6e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_3.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 33231415
+       add-int v0, v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_4.d
new file mode 100644
index 0000000..0ce8bbc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_4.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int v0, v1, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.d
new file mode 100644
index 0000000..a92add0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_5.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+       add-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.java
new file mode 100644
index 0000000..fa7efca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int.d;
+
+public class T_add_int_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_6.d
new file mode 100644
index 0000000..3dac6df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int/d/T_add_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_6.java
+.class public dot.junit.opcodes.add_int.d.T_add_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java
new file mode 100644
index 0000000..4804246
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_1;
+import dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_5;
+
+public class Test_add_int_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(12, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 0, 255
+     */
+    public void testN2() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(255, t.run(0, 255));
+    }
+
+    /**
+     * @title Arguments = 0, -65536
+     */
+    public void testN3() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(-65536, t.run(0, -65536));
+    }
+
+    /**
+     * @title Arguments = 0, -2147483647
+     */
+    public void testN4() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(-2147483647, t.run(0, -2147483647));
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe, 2
+     */
+    public void testN5() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(-2147483648, t.run(0x7ffffffe, 2));
+    }
+
+    /**
+     * @title Arguments = -1, 1
+     */
+    public void testN6() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(0, t.run(-1, 1));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_add_int_2addr_5 t = new T_add_int_2addr_5();
+        try {
+            t.run(1, 2f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(Integer.MAX_VALUE, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(-2, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB4() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(-2147483647, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_int_2addr_1 t = new T_add_int_2addr_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d
new file mode 100644
index 0000000..980379c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_1.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java
new file mode 100644
index 0000000..d5dc9c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_2addr.d;
+
+public class T_add_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d
new file mode 100644
index 0000000..bc0c3ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_2.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       add-int/2addr v2, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d
new file mode 100644
index 0000000..c47322e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_3.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 33231415
+       add-int/2addr v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d
new file mode 100644
index 0000000..7b4adf8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_4.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/2addr v1, v3
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d
new file mode 100644
index 0000000..042e671
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_5.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+       add-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java
new file mode 100644
index 0000000..5161361
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_2addr.d;
+
+public class T_add_int_2addr_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d
new file mode 100644
index 0000000..50a14a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_2addr_6.java
+.class public dot.junit.opcodes.add_int_2addr.d.T_add_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/2addr v2, v4
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java
new file mode 100644
index 0000000..1400145
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_16;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_5;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_1;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_10;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_11;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_12;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_2;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_3;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_4;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_6;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_7;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_8;
+import dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_9;
+
+public class Test_add_int_lit16 extends DxTestCase {
+    /**
+     * @title Arguments = 8 + 4
+     */
+    public void testN1() {
+        T_add_int_lit16_1 t = new T_add_int_lit16_1();
+        assertEquals(12, t.run());
+    }
+
+    /**
+     * @title Arguments = 0 + 255
+     */
+    public void testN2() {
+        T_add_int_lit16_2 t = new T_add_int_lit16_2();
+        assertEquals(255, t.run());
+    }
+
+    /**
+     * @title Arguments = 0 + (-32768)
+     */
+    public void testN3() {
+        T_add_int_lit16_3 t = new T_add_int_lit16_3();
+        assertEquals(-32768, t.run());
+    }
+
+    /**
+     * @title Arguments = (-2147483647) + 0
+     */
+    public void testN4() {
+        T_add_int_lit16_4 t = new T_add_int_lit16_4();
+        assertEquals(-2147483647, t.run());
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe + 2
+     */
+    public void testN5() {
+        T_add_int_lit16_5 t = new T_add_int_lit16_5();
+        assertEquals(-2147483648, t.run());
+    }
+
+    /**
+     * @title Arguments = -1 + 1
+     */
+    public void testN6() {
+        T_add_int_lit16_6 t = new T_add_int_lit16_6();
+        assertEquals(0, t.run());
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_add_int_lit16_16 t = new T_add_int_lit16_16();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 + Short.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_int_lit16_7 t = new T_add_int_lit16_7();
+        assertEquals(Short.MAX_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE + Short.MAX_VALUE
+     */
+    public void testB2() {
+        T_add_int_lit16_8 t = new T_add_int_lit16_8();
+        assertEquals(-2147450882, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE + 1
+     */
+    public void testB3() {
+        T_add_int_lit16_9 t = new T_add_int_lit16_9();
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE + 1
+     */
+    public void testB4() {
+        T_add_int_lit16_10 t = new T_add_int_lit16_10();
+        assertEquals(-2147483647, t.run());
+    }
+
+    /**
+     * @title Arguments = 0 + 0
+     */
+    public void testB5() {
+        T_add_int_lit16_11 t = new T_add_int_lit16_11();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE + Short.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_int_lit16_12 t = new T_add_int_lit16_12();
+        assertEquals(-65536, t.run());
+    }
+
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d
new file mode 100644
index 0000000..b79b0f6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_1.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 8
+       add-int/lit16 v0, v1, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java
new file mode 100644
index 0000000..93da1b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_1 {
+
+    public int run() {
+        return 8 + 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d
new file mode 100644
index 0000000..c8b348a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_10.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -2147483648
+       add-int/lit16 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java
new file mode 100644
index 0000000..2b30e1d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_10 {
+
+    public int run() {
+        return Integer.MIN_VALUE + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d
new file mode 100644
index 0000000..26fe8ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_11.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit16 v0, v1, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java
new file mode 100644
index 0000000..e9e8461
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_11 {
+
+    public int run() {
+        return 0 + 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d
new file mode 100644
index 0000000..34af2a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_12.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -32768
+       add-int/lit16 v0, v1, -32768
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java
new file mode 100644
index 0000000..bbed57b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_12 {
+
+    public int run() {
+        return Short.MIN_VALUE + Short.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d
new file mode 100644
index 0000000..95fd121
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_13.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       add-int/lit16 v0, v0, 1
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d
new file mode 100644
index 0000000..dfa3742
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_14.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 33231415
+       add-int/lit16 v0, v0, 1
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d
new file mode 100644
index 0000000..6cc4b57
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_15.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/lit16 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d
new file mode 100644
index 0000000..ba09106
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_16.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+       add-int/lit16 v0, v3, 123
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java
new file mode 100644
index 0000000..50fd369
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_16 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d
new file mode 100644
index 0000000..bc66cbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_17.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/lit16 v0, v4, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d
new file mode 100644
index 0000000..d80497f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_2.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit16 v0, v1, 255
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java
new file mode 100644
index 0000000..3a6c2c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_2 {
+
+    public int run() {
+        return 0 + 255;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d
new file mode 100644
index 0000000..3a9009d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_3.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit16 v0, v1, -32768
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java
new file mode 100644
index 0000000..c523fd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_3 {
+
+    public int run() {
+        return 0 + (-32768);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d
new file mode 100644
index 0000000..141d546
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_4.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -2147483647
+       add-int/lit16 v0, v1, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java
new file mode 100644
index 0000000..980de4a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_4 {
+
+    public int run() {
+        return (-2147483647) + 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d
new file mode 100644
index 0000000..54f42ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_5.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0x7ffffffe
+       add-int/lit16 v0, v1, 2
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java
new file mode 100644
index 0000000..f22579d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_5 {
+
+    public int run() {
+        return 0x7ffffffe + 2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d
new file mode 100644
index 0000000..b103f66
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_6.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1
+       add-int/lit16 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java
new file mode 100644
index 0000000..342df4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_6 {
+
+    public int run() {
+        return -1 + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d
new file mode 100644
index 0000000..b4d689f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_7.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit16 v0, v1, 32767
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java
new file mode 100644
index 0000000..afd6e25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_7 {
+
+    public int run() {
+        return 0 + Short.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d
new file mode 100644
index 0000000..e1aa77e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_8.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       add-int/lit16 v0, v1, 32767
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java
new file mode 100644
index 0000000..c63d9e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_8 {
+
+    public int run() {
+        return Integer.MAX_VALUE + Short.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d
new file mode 100644
index 0000000..74d8cc0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit16_9.java
+.class public dot.junit.opcodes.add_int_lit16.d.T_add_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       add-int/lit16 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java
new file mode 100644
index 0000000..71613ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit16.d;
+
+public class T_add_int_lit16_9 {
+
+    public int run() {
+        return Integer.MAX_VALUE + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java
new file mode 100644
index 0000000..f9b3eef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_16;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_1;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_10;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_11;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_12;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_2;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_3;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_4;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_5;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_6;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_7;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_8;
+import dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_9;
+
+public class Test_add_int_lit8 extends DxTestCase {
+    /**
+     * @title Arguments = 8 + 4
+     */
+    public void testN1() {
+        T_add_int_lit8_1 t = new T_add_int_lit8_1();
+        assertEquals(12, t.run());
+    }
+
+    /**
+     * @title Arguments = Byte.MIN_VALUE + Byte.MAX_VALUE
+     */
+    public void testN2() {
+        T_add_int_lit8_2 t = new T_add_int_lit8_2();
+        assertEquals(-1, t.run());
+    }
+
+    /**
+     * @title Arguments = 0 + (-128)
+     */
+    public void testN3() {
+        T_add_int_lit8_3 t = new T_add_int_lit8_3();
+        assertEquals(-128, t.run());
+    }
+
+    /**
+     * @title Arguments = (-2147483647) + 0
+     */
+    public void testN4() {
+        T_add_int_lit8_4 t = new T_add_int_lit8_4();
+        assertEquals(-2147483647, t.run());
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe + 2
+     */
+    public void testN5() {
+        T_add_int_lit8_5 t = new T_add_int_lit8_5();
+        assertEquals(-2147483648, t.run());
+    }
+
+    /**
+     * @title Arguments = -1 + 1
+     */
+    public void testN6() {
+        T_add_int_lit8_6 t = new T_add_int_lit8_6();
+        assertEquals(0, t.run());
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this sum of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_add_int_lit8_16 t = new T_add_int_lit8_16();
+        try {
+            t.run(3f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 + Byte.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_int_lit8_7 t = new T_add_int_lit8_7();
+        assertEquals(Byte.MAX_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE + Byte.MAX_VALUE
+     */
+    public void testB2() {
+        T_add_int_lit8_8 t = new T_add_int_lit8_8();
+        assertEquals(-2147483522, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE + 1
+     */
+    public void testB3() {
+        T_add_int_lit8_9 t = new T_add_int_lit8_9();
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE + 1
+     */
+    public void testB4() {
+        T_add_int_lit8_10 t = new T_add_int_lit8_10();
+        assertEquals(-2147483647, t.run());
+    }
+
+    /**
+     * @title Arguments = 0 + 0
+     */
+    public void testB5() {
+        T_add_int_lit8_11 t = new T_add_int_lit8_11();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE + Byte.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_int_lit8_12 t = new T_add_int_lit8_12();
+        assertEquals(-32896, t.run());
+    }
+
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d
new file mode 100644
index 0000000..5286f6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_1.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 8
+       add-int/lit8 v0, v1, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java
new file mode 100644
index 0000000..732ee8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_1 {
+
+    public int run() {
+        return 8 + 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d
new file mode 100644
index 0000000..9ef34ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_10.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -2147483648
+       add-int/lit8 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java
new file mode 100644
index 0000000..68c301d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_10 {
+
+    public int run() {
+        return Integer.MIN_VALUE + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d
new file mode 100644
index 0000000..88c76b3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_11.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit8 v0, v1, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java
new file mode 100644
index 0000000..43b33cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_11 {
+
+    public int run() {
+        return 0 + 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d
new file mode 100644
index 0000000..a8776f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_12.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -32768
+       add-int/lit8 v0, v1, -128
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java
new file mode 100644
index 0000000..cfb1577
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_12 {
+
+    public int run() {
+        return Short.MIN_VALUE + Byte.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d
new file mode 100644
index 0000000..d5a468b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_13.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       add-int/lit8 v0, v0, 1
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d
new file mode 100644
index 0000000..873fff0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_14.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 33231415
+       add-int/lit8 v0, v0, 1
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d
new file mode 100644
index 0000000..28b894e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_15.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/lit8 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d
new file mode 100644
index 0000000..3d4d8c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_16.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+       add-int/lit8 v0, v3, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java
new file mode 100644
index 0000000..c482a64
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_16 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d
new file mode 100644
index 0000000..6bdf030
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_17.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       add-int/lit8 v0, v4, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d
new file mode 100644
index 0000000..ef0a0fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_2.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -128
+       add-int/lit8 v0, v1, 127
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java
new file mode 100644
index 0000000..acf2a79
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_2 {
+
+    public int run() {
+        return Byte.MIN_VALUE + Byte.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d
new file mode 100644
index 0000000..9a49def
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_3.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit8 v0, v1, -128
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java
new file mode 100644
index 0000000..8c10f8f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_3 {
+
+    public int run() {
+        return 0 + (-128);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d
new file mode 100644
index 0000000..a3fd7dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_4.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -2147483647
+       add-int/lit8 v0, v1, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java
new file mode 100644
index 0000000..06a8fad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_4 {
+
+    public int run() {
+        return (-2147483647) + 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d
new file mode 100644
index 0000000..ab9f0ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_5.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0x7ffffffe
+       add-int/lit8 v0, v1, 2
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java
new file mode 100644
index 0000000..6691276
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_5 {
+
+    public int run() {
+        return 0x7ffffffe + 2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d
new file mode 100644
index 0000000..4ea7fdb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_6.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1
+       add-int/lit8 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java
new file mode 100644
index 0000000..122a899
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_6 {
+
+    public int run() {
+        return -1 + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d
new file mode 100644
index 0000000..01fdc0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_7.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       add-int/lit8 v0, v1, 127
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java
new file mode 100644
index 0000000..7ec523e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_7 {
+
+    public int run() {
+        return 0 + Byte.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d
new file mode 100644
index 0000000..75d74b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_8.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       add-int/lit8 v0, v1, 127
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java
new file mode 100644
index 0000000..957ccee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_8 {
+
+    public int run() {
+        return Integer.MAX_VALUE + Byte.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d
new file mode 100644
index 0000000..a28afd0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_int_lit8_9.java
+.class public dot.junit.opcodes.add_int_lit8.d.T_add_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       add-int/lit8 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java
new file mode 100644
index 0000000..bdc657c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_int_lit8.d;
+
+public class T_add_int_lit8_9 {
+
+    public int run() {
+        return Integer.MAX_VALUE + 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/Test_add_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/Test_add_long.java
new file mode 100644
index 0000000..301879a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/Test_add_long.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_long.d.T_add_long_1;
+import dot.junit.opcodes.add_long.d.T_add_long_6;
+
+public class Test_add_long extends DxTestCase {
+    /**
+     * @title Arguments = 12345678l, 87654321l
+     */
+    public void testN1() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(99999999l, t.run(12345678l, 87654321l));
+    }
+
+    /**
+     * @title Arguments = 0l, 87654321l
+     */
+    public void testN2() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(87654321l, t.run(0l, 87654321l));
+    }
+
+    /**
+     * @title Arguments = -12345678l, 0l
+     */
+    public void testN3() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-12345678l, t.run(-12345678l, 0l));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this sum of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_add_long_6 t = new T_add_long_6();
+        try {
+            t.run();
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0 + Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(9223372036854775807L, t.run(0l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0 + Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-9223372036854775808L, t.run(0l, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0 + 0
+     */
+    public void testB3() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(0l, t.run(0l, 0l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-2, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + Long.MIN_VALUE
+     */
+    public void testB5() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE + Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE + 1
+     */
+    public void testB7() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-9223372036854775807l, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + 1
+     */
+    public void testB8() {
+        T_add_long_1 t = new T_add_long_1();
+        assertEquals(-9223372036854775808l, t.run(Long.MAX_VALUE, 1l));
+    }
+
+
+    
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long.d.T_add_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / integer
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long.d.T_add_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long.d.T_add_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long.d.T_add_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.d
new file mode 100644
index 0000000..2dc5518
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_1.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.java
new file mode 100644
index 0000000..a6bd026
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long.d;
+
+public class T_add_long_1 {
+
+    public long run(long a, long b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_2.d
new file mode 100644
index 0000000..83eaa73
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long v0, v3, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_3.d
new file mode 100644
index 0000000..3935188
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_3.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       const v5, 12345
+       add-long v0, v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_4.d
new file mode 100644
index 0000000..9dab202
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_4.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       const v5, 12345.0
+       add-long v0, v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_5.d
new file mode 100644
index 0000000..5c57aeb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_5.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long v0, v2, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.d
new file mode 100644
index 0000000..435256f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_6.java
+.class public dot.junit.opcodes.add_long.d.T_add_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 7
+
+       const-wide v2, 31415
+       const-wide v4, 3.1415
+       add-long v0, v2, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.java
new file mode 100644
index 0000000..4cdc6c5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long/d/T_add_long_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long.d;
+
+public class T_add_long_6 {
+
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java
new file mode 100644
index 0000000..c3ef53c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_1;
+import dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_6;
+
+public class Test_add_long_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 12345678l, 87654321l
+     */
+    public void testN1() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(99999999l, t.run(12345678l, 87654321l));
+    }
+
+    /**
+     * @title Arguments = 0l, 87654321l
+     */
+    public void testN2() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(87654321l, t.run(0l, 87654321l));
+    }
+
+    /**
+     * @title Arguments = -12345678l, 0l
+     */
+    public void testN3() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-12345678l, t.run(-12345678l, 0l));
+    }
+
+   /**
+    * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+    * so this sum of long and double makes no sense but shall not crash the VM.  
+    */
+   public void testN4() {
+       T_add_long_2addr_6 t = new T_add_long_2addr_6();
+       try {
+           t.run();
+       } catch (Throwable e) {
+       }
+   }
+    
+    /**
+     * @title Arguments = 0 + Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(9223372036854775807L, t.run(0l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0 + Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(0l, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0 + 0
+     */
+    public void testB3() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(0l, t.run(0l, 0l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-2, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + Long.MIN_VALUE
+     */
+    public void testB5() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE + Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE + 1
+     */
+    public void testB7() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-9223372036854775807l, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE + 1
+     */
+    public void testB8() {
+        T_add_long_2addr_1 t = new T_add_long_2addr_1();
+        assertEquals(-9223372036854775808l, t.run(Long.MAX_VALUE, 1l));
+    }
+
+
+    
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / integer
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference / long
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d
new file mode 100644
index 0000000..ec11b7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_1.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long/2addr v3, v5
+       return-wide v3
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java
new file mode 100644
index 0000000..e799c7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long_2addr.d;
+
+public class T_add_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a+b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d
new file mode 100644
index 0000000..8172613
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_2.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long/2addr v3, v7
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d
new file mode 100644
index 0000000..e10a72a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_3.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       const v5, 12345
+       add-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d
new file mode 100644
index 0000000..1073b6c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_4.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       const v5, 12345.0
+       add-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d
new file mode 100644
index 0000000..3455016
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_5.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       add-long/2addr v2, v5
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d
new file mode 100644
index 0000000..7c842cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_add_long_2addr_6.java
+.class public dot.junit.opcodes.add_long_2addr.d.T_add_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 7
+
+       const-wide v2, 31415
+       const-wide v4, 3.1415
+       add-long/2addr v2, v4
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java
new file mode 100644
index 0000000..8badad9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.add_long_2addr.d;
+
+public class T_add_long_2addr_6 {
+
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/Test_aget.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/Test_aget.java
new file mode 100644
index 0000000..d33e943
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/Test_aget.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget.d.T_aget_1;
+import dot.junit.opcodes.aget.d.T_aget_8;
+
+public class Test_aget extends DxTestCase {
+    /**
+     * @title get int from array
+     */
+    public void testN1() {
+        T_aget_1 t = new T_aget_1();
+        int[] arr = new int[2];
+        arr[1] = 100000000;
+        assertEquals(100000000, t.run(arr, 1));
+    }
+
+    /**
+     * @title get int from array
+     */
+    public void testN2() {
+        T_aget_1 t = new T_aget_1();
+        int[] arr = new int[2];
+        arr[0] = 100000000;
+        assertEquals(100000000, t.run(arr, 0));
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        int[] arr = new int[2];
+        T_aget_8 t = new T_aget_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_1 t = new T_aget_1();
+        int[] arr = new int[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_1 t = new T_aget_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_1 t = new T_aget_1();
+        int[] arr = new int[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - Object, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double[], int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget.d.T_aget_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.d
new file mode 100644
index 0000000..549fdb5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_1.java
+.class public dot.junit.opcodes.aget.d.T_aget_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)I
+.limit regs 9
+
+       aget v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.java
new file mode 100644
index 0000000..75a2874
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget.d;
+
+public class T_aget_1 {
+    public int run(int[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_2.d
new file mode 100644
index 0000000..2d31759
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_2.java
+.class public dot.junit.opcodes.aget.d.T_aget_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ID)I
+.limit regs 9
+
+       aget v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_3.d
new file mode 100644
index 0000000..72731ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_3.java
+.class public dot.junit.opcodes.aget.d.T_aget_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IJ)I
+.limit regs 9
+
+       aget v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_4.d
new file mode 100644
index 0000000..8e3b970
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_4.java
+.class public dot.junit.opcodes.aget.d.T_aget_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)I
+.limit regs 9
+
+       aget v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_5.d
new file mode 100644
index 0000000..e0d2005
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_5.java
+.class public dot.junit.opcodes.aget.d.T_aget_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)I
+.limit regs 9
+
+       aget v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_6.d
new file mode 100644
index 0000000..41a009c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_6.java
+.class public dot.junit.opcodes.aget.d.T_aget_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)I
+.limit regs 9
+
+       aget v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_7.d
new file mode 100644
index 0000000..8b2c021
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_7.java
+.class public dot.junit.opcodes.aget.d.T_aget_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)I
+.limit regs 9
+
+       aget v0, v7, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.d
new file mode 100644
index 0000000..e91d276
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_8.java
+.class public dot.junit.opcodes.aget.d.T_aget_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IF)I
+.limit regs 9
+
+       aget v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.java
new file mode 100644
index 0000000..1174ced
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget.d;
+
+public class T_aget_8 {
+    public int run(int[] arr, float idx) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_9.d
new file mode 100644
index 0000000..51fe7a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget/d/T_aget_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_9.java
+.class public dot.junit.opcodes.aget.d.T_aget_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)I
+.limit regs 9
+
+       aget v0, v7, v9
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java
new file mode 100644
index 0000000..3d8bd6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_boolean.d.T_aget_boolean_1;
+import dot.junit.opcodes.aget_boolean.d.T_aget_boolean_8;
+
+public class Test_aget_boolean extends DxTestCase {
+    /**
+     * @title get boolean from array 
+     */
+    public void testN1() {
+        T_aget_boolean_1 t = new T_aget_boolean_1();
+        boolean[] arr = new boolean[2];
+        arr[1] = true;
+        assertEquals(true, t.run(arr, 1));
+    }
+
+    /**
+     * @title get boolean from array
+     */
+    public void testN2() {
+        T_aget_boolean_1 t = new T_aget_boolean_1();
+        boolean[] arr = new boolean[2];
+        arr[0] = true;
+        assertEquals(true, t.run(arr, 0));
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        boolean[] arr = new boolean[2];
+        T_aget_boolean_8 t = new T_aget_boolean_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_boolean_1 t = new T_aget_boolean_1();
+        boolean[] arr = new boolean[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_boolean_1 t = new T_aget_boolean_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_boolean_1 t = new T_aget_boolean_1();
+        boolean[] arr = new boolean[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_boolean.d.T_aget_boolean_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d
new file mode 100644
index 0000000..6fbf9bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_1.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZI)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java
new file mode 100644
index 0000000..5ab595d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_boolean.d;
+
+public class T_aget_boolean_1 {
+    public boolean run(boolean[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d
new file mode 100644
index 0000000..e858a8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_2.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZD)Z
+.limit regs 9
+
+       aget-boolean v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d
new file mode 100644
index 0000000..07133df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_3.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZJ)Z
+.limit regs 9
+
+       aget-boolean v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d
new file mode 100644
index 0000000..28f6cb1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_4.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d
new file mode 100644
index 0000000..e1c1ffe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_5.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d
new file mode 100644
index 0000000..ef79c81
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_6.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d
new file mode 100644
index 0000000..da3663c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_7.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZI)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d
new file mode 100644
index 0000000..5c36f5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_8.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZF)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java
new file mode 100644
index 0000000..ff40523
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_boolean.d;
+
+public class T_aget_boolean_8 {
+    public boolean run(boolean[] arr, float idx) {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d
new file mode 100644
index 0000000..cbd51e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_boolean_9.java
+.class public dot.junit.opcodes.aget_boolean.d.T_aget_boolean_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZI)Z
+.limit regs 9
+
+       aget-boolean v0, v7, v9
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java
new file mode 100644
index 0000000..fcaeab4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_byte.d.T_aget_byte_1;
+import dot.junit.opcodes.aget_byte.d.T_aget_byte_8;
+
+
+public class Test_aget_byte extends DxTestCase {
+    /**
+     * @title get byte from array
+     */
+    public void testN1() {
+        T_aget_byte_1 t = new T_aget_byte_1();
+        byte[] arr = new byte[2];
+        arr[1] = 100;
+        assertEquals(100, t.run(arr, 1));
+    }
+
+    /**
+     * @title get byte from array
+     */
+    public void testN2() {
+        T_aget_byte_1 t = new T_aget_byte_1();
+        byte[] arr = new byte[2];
+        arr[0] = 100;
+        assertEquals(100, t.run(arr, 0));
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+         byte[] arr = new byte[2];
+         T_aget_byte_8 t = new T_aget_byte_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_byte_1 t = new T_aget_byte_1();
+        byte[] arr = new byte[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_byte_1 t = new T_aget_byte_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_byte_1 t = new T_aget_byte_1();
+        byte[] arr = new byte[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, short
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_byte.d.T_aget_byte_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d
new file mode 100644
index 0000000..2fa8a9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_1.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BI)B
+.limit regs 9
+
+       aget-byte v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java
new file mode 100644
index 0000000..72646a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_byte.d;
+
+public class T_aget_byte_1 {
+    public byte run(byte[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d
new file mode 100644
index 0000000..11eba1a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_2.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BI)B
+.limit regs 9
+
+       const-wide v1, 1.0
+       aget-byte v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d
new file mode 100644
index 0000000..c2b426b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_3.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BI)B
+.limit regs 9
+
+       const-wide v1, 1
+       aget-byte v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d
new file mode 100644
index 0000000..905f4b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_4.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)B
+.limit regs 9
+
+       aget-byte v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d
new file mode 100644
index 0000000..b65b94e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_5.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)B
+.limit regs 9
+
+       aget-byte v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d
new file mode 100644
index 0000000..6861fa4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_6.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)B
+.limit regs 9
+
+       aget-byte v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d
new file mode 100644
index 0000000..03ab879
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_7.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BI)B
+.limit regs 9
+
+       aget-byte v0, v7, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d
new file mode 100644
index 0000000..92f0273
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_8.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BF)B
+.limit regs 9
+
+       aget-byte v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java
new file mode 100644
index 0000000..af7c391
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_byte.d;
+
+public class T_aget_byte_8 {
+    public byte run(byte[] arr, float idx) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d
new file mode 100644
index 0000000..b2d4ffd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_byte_9.java
+.class public dot.junit.opcodes.aget_byte.d.T_aget_byte_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BI)B
+.limit regs 9
+
+       aget-byte v0, v7, v9
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/Test_aget_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/Test_aget_char.java
new file mode 100644
index 0000000..8871a9e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/Test_aget_char.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_char.d.T_aget_char_1;
+import dot.junit.opcodes.aget_char.d.T_aget_char_8;
+
+public class Test_aget_char extends DxTestCase {
+    /**
+     * @title get char from array 
+     */
+    public void testN1() {
+        T_aget_char_1 t = new T_aget_char_1();
+        char[] arr = new char[2];
+        arr[1] = 'g';
+        assertEquals('g', t.run(arr, 1));
+    }
+
+    /**
+     * @title get char from array
+     */
+    public void testN2() {
+        T_aget_char_1 t = new T_aget_char_1();
+        char[] arr = new char[2];
+        arr[0] = 'g';
+        assertEquals('g', t.run(arr, 0));
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        char[] arr = new char[2];
+        T_aget_char_8 t = new T_aget_char_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_char_1 t = new T_aget_char_1();
+        char[] arr = new char[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_char_1 t = new T_aget_char_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_char_1 t = new T_aget_char_1();
+        char[] arr = new char[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, char
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], char
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_char.d.T_aget_char_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d
new file mode 100644
index 0000000..0789458
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_1.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CI)C
+.limit regs 9
+
+       aget-char v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java
new file mode 100644
index 0000000..b15a052
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_char.d;
+
+public class T_aget_char_1 {
+    public char run(char[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d
new file mode 100644
index 0000000..ff1b8fd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_2.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CD)C
+.limit regs 9
+
+       aget-char v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d
new file mode 100644
index 0000000..b197a3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_3.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CJ)C
+.limit regs 9
+
+       aget-char v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d
new file mode 100644
index 0000000..53904af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_4.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)C
+.limit regs 9
+
+       aget-char v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d
new file mode 100644
index 0000000..ed9a20d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_5.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)C
+.limit regs 9
+
+       aget-char v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d
new file mode 100644
index 0000000..04cee20
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_6.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)C
+.limit regs 9
+
+       aget-char v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d
new file mode 100644
index 0000000..508f6fb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_7.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CI)C
+.limit regs 9
+
+       aget-char v0, v7, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d
new file mode 100644
index 0000000..daaa044
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_8.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CF)C
+.limit regs 9
+
+       aget-char v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java
new file mode 100644
index 0000000..8cf681a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_char.d;
+
+public class T_aget_char_8 {
+    public char run(char[] arr, float idx) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d
new file mode 100644
index 0000000..4053996
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_char_9.java
+.class public dot.junit.opcodes.aget_char.d.T_aget_char_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CI)C
+.limit regs 9
+
+       aget-char v0, v7, v9
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/Test_aget_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/Test_aget_object.java
new file mode 100644
index 0000000..691c57c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/Test_aget_object.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_object.d.T_aget_object_1;
+import dot.junit.opcodes.aget_object.d.T_aget_object_8;
+
+
+public class Test_aget_object extends DxTestCase {
+     /**
+     * @title get reference from array
+     */
+    public void testN1() {
+        T_aget_object_1 t = new T_aget_object_1();
+        String[] arr = new String[] {"a", "b"};
+        assertEquals("a", t.run(arr, 0));
+    }
+
+    /**
+     * @title  get reference from array
+     */
+    public void testN2() {
+        T_aget_object_1 t = new T_aget_object_1();
+        String[] arr = new String[] {"a", "b"};
+        assertEquals("b", t.run(arr, 1));
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        String[] arr = new String[] {"a", "b"};
+        T_aget_object_8 t = new T_aget_object_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_object_1 t = new T_aget_object_1();
+        String[] arr = new String[] {"a", "b"};
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aioobe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE2() {
+        T_aget_object_1 t = new T_aget_object_1();
+        String[] arr = new String[] {"a", "b"};
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aioobe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE3() {
+        T_aget_object_1 t = new T_aget_object_1();
+        String[] arr = null;
+        try {
+            t.run(arr, 0);
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float[], int
+     */
+    public void testVFE4() {
+        try { 
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_object.d.T_aget_object_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d
new file mode 100644
index 0000000..8f4a03b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_1.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;I)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v8
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java
new file mode 100644
index 0000000..03345c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_object.d;
+
+public class T_aget_object_1 {
+    
+    public String run(String [] arr, int idx) {
+        return arr[idx];
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d
new file mode 100644
index 0000000..cbdd6b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_2.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;I)Ljava/lang/String;
+.limit regs 9
+
+       const-wide v1, 1.0
+       aget-object v0, v7, v1
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d
new file mode 100644
index 0000000..c89b572
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_3.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;I)Ljava/lang/String;
+.limit regs 9
+
+       const-wide v1, 1
+       aget-object v0, v7, v1
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d
new file mode 100644
index 0000000..b881a16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_4.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v8
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d
new file mode 100644
index 0000000..7db8d5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_5.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([FI)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v8
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d
new file mode 100644
index 0000000..a349943
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_6.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v8
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d
new file mode 100644
index 0000000..8b904d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_7.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;I)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v6
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d
new file mode 100644
index 0000000..89ee37d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_8.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;F)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v8
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java
new file mode 100644
index 0000000..c8b33e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_object.d;
+
+public class T_aget_object_8 {
+    
+    public String run(String [] arr, float idx) {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d
new file mode 100644
index 0000000..e977101
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_object_9.java
+.class public dot.junit.opcodes.aget_object.d.T_aget_object_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;I)Ljava/lang/String;
+.limit regs 9
+
+       aget-object v0, v7, v9
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/Test_aget_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/Test_aget_short.java
new file mode 100644
index 0000000..b0a12e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/Test_aget_short.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_short.d.T_aget_short_1;
+import dot.junit.opcodes.aget_short.d.T_aget_short_8;
+
+public class Test_aget_short extends DxTestCase {
+    /**
+     * @title get short from array
+     */
+    public void testN1() {
+        T_aget_short_1 t = new T_aget_short_1();
+        short[] arr = new short[2];
+        arr[1] = 10000;
+        assertEquals(10000, t.run(arr, 1));
+    }
+
+    /**
+     * @title  get short from array
+     */
+    public void testN2() {
+        T_aget_short_1 t = new T_aget_short_1();
+        short[] arr = new short[2];
+        arr[0] = 10000;
+        assertEquals(10000, t.run(arr, 0));
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        short[] arr = new short[2];
+        T_aget_short_8 t = new T_aget_short_8();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_short_1 t = new T_aget_short_1();
+        short[] arr = new short[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_short_1 t = new T_aget_short_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_short_1 t = new T_aget_short_1();
+        short[] arr = new short[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int[], int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_short.d.T_aget_short_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d
new file mode 100644
index 0000000..3a1d451
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_1.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SI)S
+.limit regs 9
+
+       aget-short v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java
new file mode 100644
index 0000000..d3ff01a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_short.d;
+
+public class T_aget_short_1 {
+    public short run(short[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d
new file mode 100644
index 0000000..67bb914
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_2.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SI)S
+.limit regs 9
+
+       const-wide v1, 1.0
+       aget-short v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d
new file mode 100644
index 0000000..e55e873
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_3.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SI)S
+.limit regs 9
+
+       const-wide v1, 1
+       aget-short v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d
new file mode 100644
index 0000000..36e9428
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_4.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)S
+.limit regs 9
+
+       aget-short v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d
new file mode 100644
index 0000000..990a231
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_5.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)S
+.limit regs 9
+
+       aget-short v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d
new file mode 100644
index 0000000..5490c9f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_6.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)S
+.limit regs 9
+
+       aget-short v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d
new file mode 100644
index 0000000..06e1029
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_7.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SI)S
+.limit regs 9
+
+       aget-short v0, v7, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d
new file mode 100644
index 0000000..92f0d1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_8.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SF)S
+.limit regs 9
+
+       aget-short v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java
new file mode 100644
index 0000000..d661d27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_short.d;
+
+public class T_aget_short_8 {
+    public short run(short[] arr, float idx) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d
new file mode 100644
index 0000000..d337120
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_short_9.java
+.class public dot.junit.opcodes.aget_short.d.T_aget_short_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SI)S
+.limit regs 9
+
+       aget-short v0, v7, v9
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java
new file mode 100644
index 0000000..73b3357
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aget_wide.d.T_aget_wide_1;
+import dot.junit.opcodes.aget_wide.d.T_aget_wide_10;
+import dot.junit.opcodes.aget_wide.d.T_aget_wide_2;
+
+
+public class Test_aget_wide extends DxTestCase {
+
+    /**
+     * @title get long from array 
+     */
+    public void testN1() {
+        T_aget_wide_1 t = new T_aget_wide_1();
+        long[] arr = new long[2];
+        arr[1] = 1000000000000000000l;
+        assertEquals(1000000000000000000l, t.run(arr, 1));
+    }
+
+    /**
+     * @title get long from array
+     */
+    public void testN2() {
+        T_aget_wide_1 t = new T_aget_wide_1();
+        long[] arr = new long[2];
+        arr[0] = 1000000000000000000l;
+        assertEquals(1000000000000000000l, t.run(arr, 0));
+    }
+    
+    /**
+     * @title get double from array
+     */
+    public void testN3() {
+        T_aget_wide_2 t = new T_aget_wide_2();
+        double[] arr = new double[2];
+        arr[0] = 3.1415d;
+        assertEquals(3.1415d, t.run(arr, 0));
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float] makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        long[] arr = new long[2];
+        T_aget_wide_10 t = new T_aget_wide_10();
+        try {
+            t.run(arr, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aget_wide_1 t = new T_aget_wide_1();
+        long[] arr = new long[2];
+        try {
+            t.run(arr, 2);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aget_wide_1 t = new T_aget_wide_1();
+        try {
+            t.run(null, 2);
+            fail("expected NullPointerException");
+        } catch (NullPointerException np) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aget_wide_1 t = new T_aget_wide_1();
+        long[] arr = new long[2];
+        try {
+            t.run(arr, -1);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int[], int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aget_wide.d.T_aget_wide_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d
new file mode 100644
index 0000000..08d842a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_1.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       aget-wide v0, v6, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java
new file mode 100644
index 0000000..fdc8575
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_wide.d;
+
+public class T_aget_wide_1 {
+
+    public long run(long[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d
new file mode 100644
index 0000000..5bbac0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_10.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JF)J
+.limit regs 8
+
+       aget-wide v0, v6, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java
new file mode 100644
index 0000000..c5f66a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_wide.d;
+
+public class T_aget_wide_10 {
+
+    public long run(long[] arr, float idx) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d
new file mode 100644
index 0000000..e174a37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_11.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       aget-wide v7, v6, v7
+       return-wide v7
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d
new file mode 100644
index 0000000..5372845
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_2.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DI)D
+.limit regs 8
+
+       aget-wide v0, v6, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java
new file mode 100644
index 0000000..1b2aace
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aget_wide.d;
+
+public class T_aget_wide_2 {
+
+    public double run(double[] arr, int idx) {
+        return arr[idx];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d
new file mode 100644
index 0000000..cf462df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_3.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       const-wide v2, 1.0
+       aget-wide v0, v6, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d
new file mode 100644
index 0000000..1c407ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_5.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       const-wide v2, 10
+       aget-wide v0, v6, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d
new file mode 100644
index 0000000..39054f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_6.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;I)J
+.limit regs 8
+
+       aget-wide v0, v6, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d
new file mode 100644
index 0000000..ace153e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_7.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([II)J
+.limit regs 8
+
+       aget-wide v0, v6, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d
new file mode 100644
index 0000000..dfe1b21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_8.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       aget-wide v0, v6, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d
new file mode 100644
index 0000000..fe00c45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aget_wide_9.java
+.class public dot.junit.opcodes.aget_wide.d.T_aget_wide_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JI)J
+.limit regs 8
+
+       aget-wide v0, v6, v8
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/Test_and_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/Test_and_int.java
new file mode 100644
index 0000000..1422844
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/Test_and_int.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_int.d.T_and_int_1;
+import dot.junit.opcodes.and_int.d.T_and_int_5;
+
+
+public class Test_and_int extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_and_int_1 t = new T_and_int_1();
+        assertEquals(8, t.run(15, 8));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+        T_and_int_1 t = new T_and_int_1();
+        assertEquals(0xfffffff0, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_and_int_1 t = new T_and_int_1();
+        assertEquals(0xcafe, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float & int) makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_and_int_5 t = new T_and_int_5();
+        try {
+            t.run(123, 44.44f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_int_1 t = new T_and_int_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_int_1 t = new T_and_int_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int.d.T_and_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int.d.T_and_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int.d.T_and_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int.d.T_and_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.d
new file mode 100644
index 0000000..b1f2984
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_1.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.java
new file mode 100644
index 0000000..72c1c1e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int.d;
+
+public class T_and_int_1 {
+
+    public int run(int a, int b) {
+        return a & b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_2.d
new file mode 100644
index 0000000..f57ddbc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       and-int v2, v0, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_3.d
new file mode 100644
index 0000000..033b3af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_3.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 31415
+       and-int v2, v0, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_4.d
new file mode 100644
index 0000000..9759124
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_4.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int v0, v2, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.d
new file mode 100644
index 0000000..b7480ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_5.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+       and-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.java
new file mode 100644
index 0000000..4f547a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int.d;
+
+public class T_and_int_5 {
+
+    public int run(int i, float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_6.d
new file mode 100644
index 0000000..7a3d212
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int/d/T_and_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_6.java
+.class public dot.junit.opcodes.and_int.d.T_and_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java
new file mode 100644
index 0000000..bc8848b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_1;
+import dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_5;
+
+public class Test_and_int_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_and_int_2addr_1 t = new T_and_int_2addr_1();
+        assertEquals(8, t.run(15, 8));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+        T_and_int_2addr_1 t = new T_and_int_2addr_1();
+        assertEquals(0xfffffff0, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_and_int_2addr_1 t = new T_and_int_2addr_1();
+        assertEquals(0xcafe, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float & int) makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_and_int_2addr_5 t = new T_and_int_2addr_5();
+        try {
+            t.run(1, 1.222f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_int_2addr_1 t = new T_and_int_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_int_2addr_1 t = new T_and_int_2addr_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d
new file mode 100644
index 0000000..faf2f0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_1.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java
new file mode 100644
index 0000000..4df72cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_2addr.d;
+
+public class T_and_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a & b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d
new file mode 100644
index 0000000..5906582
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_2.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       and-int/2addr v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d
new file mode 100644
index 0000000..4d26208
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_3.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 31415
+       and-int/2addr v0, v3
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d
new file mode 100644
index 0000000..6bfff72
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_4.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int/2addr v2, v1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d
new file mode 100644
index 0000000..c7183c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_5.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+       and-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java
new file mode 100644
index 0000000..3cbb301
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_2addr.d;
+
+public class T_and_int_2addr_5 {
+
+    public int run(int i, float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d
new file mode 100644
index 0000000..b5d1901
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_2addr_6.java
+.class public dot.junit.opcodes.and_int_2addr.d.T_and_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int/2addr v2, v4
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java
new file mode 100644
index 0000000..c1c8bc6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_5;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_1;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_2;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_3;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_4;
+import dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_9;
+
+public class Test_and_int_lit16 extends DxTestCase {
+    /**
+     * @title Arguments = 15 & 8
+     */
+    public void testN1() {
+        T_and_int_lit16_1 t = new T_and_int_lit16_1();
+        assertEquals(8, t.run());
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8 & -8
+     */
+    public void testN2() {
+        T_and_int_lit16_2 t = new T_and_int_lit16_2();
+        assertEquals(-8, t.run());
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_and_int_lit16_3 t = new T_and_int_lit16_3();
+        assertEquals(0xcafe, t.run());
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float & int) makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_and_int_lit16_9 t = new T_and_int_lit16_9();
+        try {
+            t.run(11.33f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_int_lit16_4 t = new T_and_int_lit16_4();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = Short.MAX_VALUE & Short.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_int_lit16_5 t = new T_and_int_lit16_5();
+        assertEquals(0, t.run());
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double & int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d
new file mode 100644
index 0000000..ebc9f85
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_1.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 15
+       and-int/lit16 v0, v0, 8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java
new file mode 100644
index 0000000..1f166e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_1 {
+
+    public int run() {
+        return 15 & 8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d
new file mode 100644
index 0000000..ce46afc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_10.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int/lit16 v0, v4, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d
new file mode 100644
index 0000000..a76ada7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_2.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, -7
+       and-int/lit16 v0, v0, -8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java
new file mode 100644
index 0000000..aa93cc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_2 {
+
+    public int run() {
+        return 0xfffffff8 & -8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d
new file mode 100644
index 0000000..c5f54e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_3.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 0xcafe
+       and-int/lit16 v0, v0, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java
new file mode 100644
index 0000000..93558cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_3 {
+
+    public int run() {
+        return 0xcafe & -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d
new file mode 100644
index 0000000..7f31097
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_4.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 0
+       and-int/lit16 v0, v0, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java
new file mode 100644
index 0000000..12913cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_4 {
+
+    public int run() {
+        return 0 & -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d
new file mode 100644
index 0000000..d7c68f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_5.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 32767
+       and-int/lit16 v0, v0, -32768
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java
new file mode 100644
index 0000000..04e22b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_5 {
+
+    public int run() {
+        return Short.MAX_VALUE & Short.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d
new file mode 100644
index 0000000..9c94b7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_6.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       const-wide v0, 1.0
+       and-int/lit16 v0, v0, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d
new file mode 100644
index 0000000..a272dfa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_7.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       const-wide v0, 1
+       and-int/lit16 v0, v0, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d
new file mode 100644
index 0000000..614d2b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_8.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       and-int/lit16 v2, v3, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d
new file mode 100644
index 0000000..23b9e82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit16_9.java
+.class public dot.junit.opcodes.and_int_lit16.d.T_and_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+       and-int/lit16 v0, v3, 123
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java
new file mode 100644
index 0000000..0af1796
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit16.d;
+
+public class T_and_int_lit16_9 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java
new file mode 100644
index 0000000..8fb6fbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_9;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_1;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_2;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_3;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_4;
+import dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_5;
+
+public class Test_and_int_lit8 extends DxTestCase {
+    /**
+     * @title Arguments = 15 & 8
+     */
+    public void testN1() {
+        T_and_int_lit8_1 t = new T_and_int_lit8_1();
+        assertEquals(8, t.run());
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8 & -8
+     */
+    public void testN2() {
+        T_and_int_lit8_2 t = new T_and_int_lit8_2();
+        assertEquals(-8, t.run());
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_and_int_lit8_3 t = new T_and_int_lit8_3();
+        assertEquals(0xcafe, t.run());
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float & int) makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_and_int_lit8_9 t = new T_and_int_lit8_9();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }    
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_int_lit8_4 t = new T_and_int_lit8_4();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = Short.MAX_VALUE & Short.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_int_lit8_5 t = new T_and_int_lit8_5();
+        assertEquals(0, t.run());
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d
new file mode 100644
index 0000000..c357564
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_1.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 15
+       and-int/lit8 v0, v0, 8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java
new file mode 100644
index 0000000..e5972bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_1 {
+
+    public int run() {
+        return 15 & 8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d
new file mode 100644
index 0000000..d9a6181
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_10.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       and-int/lit8 v0, v4, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d
new file mode 100644
index 0000000..4161d0e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_2.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, -7
+       and-int/lit8 v0, v0, -8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java
new file mode 100644
index 0000000..ed12bb0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_2 {
+
+    public int run() {
+        return 0xfffffff8 & -8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d
new file mode 100644
index 0000000..7b5fd5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_3.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 0xcafe
+       and-int/lit8 v0, v0, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java
new file mode 100644
index 0000000..194af5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_3 {
+
+    public int run() {
+        return 0xcafe & -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d
new file mode 100644
index 0000000..5b2fd88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_4.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 0
+       and-int/lit8 v0, v0, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java
new file mode 100644
index 0000000..ac41a53
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_4 {
+
+    public int run() {
+        return 0 & -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d
new file mode 100644
index 0000000..9634339
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_5.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v0, 127
+       and-int/lit8 v0, v0, -128
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java
new file mode 100644
index 0000000..7d1e6d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_5 {
+
+    public int run() {
+        return Short.MAX_VALUE & Short.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d
new file mode 100644
index 0000000..7e6a548
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_6.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       const-wide v0, 1.0
+       and-int/lit8 v0, v0, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d
new file mode 100644
index 0000000..e09f8bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_7.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       const-wide v0, 1
+       and-int/lit8 v0, v0, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d
new file mode 100644
index 0000000..78936ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_8.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       and-int/lit8 v2, v3, 1
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d
new file mode 100644
index 0000000..cb63071
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_int_lit8_9.java
+.class public dot.junit.opcodes.and_int_lit8.d.T_and_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+       and-int/lit8 v0, v3, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java
new file mode 100644
index 0000000..27542f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_int_lit8.d;
+
+public class T_and_int_lit8_9 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/Test_and_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/Test_and_long.java
new file mode 100644
index 0000000..e2ab252
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/Test_and_long.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_long.d.T_and_long_1;
+import dot.junit.opcodes.and_long.d.T_and_long_6;
+
+public class Test_and_long extends DxTestCase {
+
+    /**
+     * @title Arguments = 0xfffffff8aal, 0xfffffff1aal
+     */
+    public void testN1() {
+        T_and_long_1 t = new T_and_long_1();
+        assertEquals(0xfffffff0aal, t.run(0xfffffff8aal, 0xfffffff1aal));
+    }
+
+    /**
+     * @title Arguments = 987654321, 123456789
+     */
+    public void testN2() {
+        T_and_long_1 t = new T_and_long_1();
+        assertEquals(39471121, t.run(987654321, 123456789));
+    }
+
+    /**
+     * @title Arguments = 0xABCDEF & -1
+     */
+    public void testN3() {
+        T_and_long_1 t = new T_and_long_1();
+        assertEquals(0xABCDEF, t.run(0xABCDEF, -1));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this (long & double) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_and_long_6 t = new T_and_long_6();
+        try {
+            t.run(1l, 5d);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_long_1 t = new T_and_long_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_long_1 t = new T_and_long_1();
+        assertEquals(0, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float & long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long.d.T_and_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long.d.T_and_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long.d.T_and_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long.d.T_and_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.d
new file mode 100644
index 0000000..9bdc34e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_1.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.java
new file mode 100644
index 0000000..9e2b07b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long.d;
+
+public class T_and_long_1 {
+
+    public long run(long a, long b) {
+        return a & b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_2.d
new file mode 100644
index 0000000..7c9185c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v10, 3.1415
+       and-long v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_3.d
new file mode 100644
index 0000000..b68acff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_3.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v10, 12345
+       and-long v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_4.d
new file mode 100644
index 0000000..97a1bcb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_4.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long v0, v9, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_5.d
new file mode 100644
index 0000000..b6948ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_5.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long v0, v10, v14
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.d
new file mode 100644
index 0000000..26ae8a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_6.java
+.class public dot.junit.opcodes.and_long.d.T_and_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 7
+
+       and-long v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.java
new file mode 100644
index 0000000..051a52a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long/d/T_and_long_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long.d;
+
+public class T_and_long_6 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java
new file mode 100644
index 0000000..34d2fc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_1;
+import dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_6;
+
+public class Test_and_long_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 0xfffffff8aal, 0xfffffff1aal
+     */
+    public void testN1() {
+        T_and_long_2addr_1 t = new T_and_long_2addr_1();
+        assertEquals(0xfffffff0aal, t.run(0xfffffff8aal, 0xfffffff1aal));
+    }
+
+    /**
+     * @title Arguments = 987654321, 123456789
+     */
+    public void testN2() {
+        T_and_long_2addr_1 t = new T_and_long_2addr_1();
+        assertEquals(39471121, t.run(987654321, 123456789));
+    }
+
+    /**
+     * @title Arguments = 0xABCDEF & -1
+     */
+    public void testN3() {
+        T_and_long_2addr_1 t = new T_and_long_2addr_1();
+        assertEquals(0xABCDEF, t.run(0xABCDEF, -1));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this (long & double) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_and_long_2addr_6 t = new T_and_long_2addr_6();
+        try {
+            t.run(1l, 3.1d);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_and_long_2addr_1 t = new T_and_long_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_and_long_2addr_1 t = new T_and_long_2addr_1();
+        assertEquals(0, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float & long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d
new file mode 100644
index 0000000..aa61af9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_1.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long/2addr v10, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java
new file mode 100644
index 0000000..3b6d259
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long_2addr.d;
+
+public class T_and_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a & b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d
new file mode 100644
index 0000000..e1a4376
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_2.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v0, 3.1415
+       and-long/2addr v0, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d
new file mode 100644
index 0000000..ba10fe6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_3.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v0, 1234
+       and-long/2addr v12, v0
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d
new file mode 100644
index 0000000..9882eb3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_4.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long/2addr v12, v9
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d
new file mode 100644
index 0000000..e7bb059
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_5.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       and-long/2addr v10, v14
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d
new file mode 100644
index 0000000..b7ee27e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_and_long_2addr_6.java
+.class public dot.junit.opcodes.and_long_2addr.d.T_and_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 7
+
+       and-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java
new file mode 100644
index 0000000..dd6a41d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.and_long_2addr.d;
+
+public class T_and_long_2addr_6 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/Test_aput.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/Test_aput.java
new file mode 100644
index 0000000..52ea328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/Test_aput.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput.d.T_aput_1;
+import dot.junit.opcodes.aput.d.T_aput_8;
+
+public class Test_aput extends DxTestCase {
+
+    /**
+     * @title put int into array
+     */
+    public void testN1() {
+        T_aput_1 t = new T_aput_1();
+        int[] arr = new int[2];
+        t.run(arr, 1, 100000000);
+        assertEquals(100000000, arr[1]);
+    }
+
+    /**
+     * @title put int into array
+     */
+    public void testN2() {
+        T_aput_1 t = new T_aput_1();
+        int[] arr = new int[2];
+        t.run(arr, 0, 100000000);
+        assertEquals(100000000, arr[0]);
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        int[] arr = new int[2];
+        T_aput_8 t = new T_aput_8();
+        try {
+            t.run(arr, 3.14f, 111f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_1 t = new T_aput_1();
+        int[] arr = new int[2];
+        try {
+            t.run(arr, 2, 100000000);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_1 t = new T_aput_1();
+        try {
+            t.run(null, 2, 100000000);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_1 t = new T_aput_1();
+        int[] arr = new int[2];
+        try {
+            t.run(arr, -1, 100000000);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, int
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput.d.T_aput_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.d
new file mode 100644
index 0000000..0c46208
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_1.java
+.class public dot.junit.opcodes.aput.d.T_aput_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([III)V
+.limit regs 11
+
+       aput v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.java
new file mode 100644
index 0000000..d9c47a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput.d;
+
+public class T_aput_1 {
+    public void run(int[] arr, int idx, int value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_2.d
new file mode 100644
index 0000000..7ef7585
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_2.java
+.class public dot.junit.opcodes.aput.d.T_aput_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IDI)V
+.limit regs 11
+
+
+       aput v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_3.d
new file mode 100644
index 0000000..f2872a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_3.java
+.class public dot.junit.opcodes.aput.d.T_aput_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IIJ)V
+.limit regs 11
+
+
+       aput v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_4.d
new file mode 100644
index 0000000..6070220
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_4.java
+.class public dot.junit.opcodes.aput.d.T_aput_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;II)V
+.limit regs 10
+
+
+       aput v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_5.d
new file mode 100644
index 0000000..9a37f62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_5.java
+.class public dot.junit.opcodes.aput.d.T_aput_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DII)V
+.limit regs 10
+
+
+       aput v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_6.d
new file mode 100644
index 0000000..82dc6ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_6.java
+.class public dot.junit.opcodes.aput.d.T_aput_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JII)V
+.limit regs 10
+
+
+       aput v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_7.d
new file mode 100644
index 0000000..66017e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_7.java
+.class public dot.junit.opcodes.aput.d.T_aput_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([III)V
+.limit regs 10
+
+       aput v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.d
new file mode 100644
index 0000000..1f56222
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_8.java
+.class public dot.junit.opcodes.aput.d.T_aput_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IFF)V
+.limit regs 11
+
+       aput v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.java
new file mode 100644
index 0000000..87c6e5c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput.d;
+
+public class T_aput_8 {
+    public void run(int[] arr, float idx, float value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_9.d
new file mode 100644
index 0000000..73c5932
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput/d/T_aput_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_9.java
+.class public dot.junit.opcodes.aput.d.T_aput_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([III)V
+.limit regs 11
+
+       aput v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
new file mode 100644
index 0000000..0ab9d04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_boolean.d.T_aput_boolean_1;
+import dot.junit.opcodes.aput_boolean.d.T_aput_boolean_8;
+
+public class Test_aput_boolean extends DxTestCase {
+    /**  
+     * @title put boolean into array 
+     */
+    public void testN1() {
+        T_aput_boolean_1 t = new T_aput_boolean_1();
+        boolean[] arr = new boolean[2];
+        t.run(arr, 1, true);
+        assertEquals(true, arr[1]);
+    }
+
+    /**
+     * @title put boolean into array
+     */
+    public void testN2() {
+        T_aput_boolean_1 t = new T_aput_boolean_1();
+        boolean[] arr = new boolean[2];
+        t.run(arr, 0, true);
+        assertEquals(true, arr[0]);
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        boolean[] arr = new boolean[2];
+        T_aput_boolean_8 t = new T_aput_boolean_8();
+        try {
+            t.run(arr, 3.14f, true);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_boolean_1 t = new T_aput_boolean_1();
+        boolean[] arr = new boolean[2];
+        try {
+            t.run(arr, 2, true);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_boolean_1 t = new T_aput_boolean_1();
+        try {
+            t.run(null, 2, true);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_boolean_1 t = new T_aput_boolean_1();
+        boolean[] arr = new boolean[2];
+        try {
+            t.run(arr, -1, true);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, int
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B15 
+     * @title put value 2 into boolean array
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d
new file mode 100644
index 0000000..0d97f3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_1.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZIZ)V
+.limit regs 11
+
+       aput-boolean v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java
new file mode 100644
index 0000000..15a0fcf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_boolean.d;
+
+public class T_aput_boolean_1 {
+    public void run(boolean[] arr, int idx, boolean value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
new file mode 100644
index 0000000..64eb60e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_10.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZIZ)V
+.limit regs 11
+
+       const v10, 2
+       aput-boolean v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d
new file mode 100644
index 0000000..2f73747
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_2.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZDZ)V
+.limit regs 11
+
+
+       aput-boolean v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d
new file mode 100644
index 0000000..9eae917
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_3.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZIJ)V
+.limit regs 11
+
+
+       aput-boolean v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d
new file mode 100644
index 0000000..54f5a19
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_4.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;IZ)V
+.limit regs 10
+
+
+       aput-boolean v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d
new file mode 100644
index 0000000..ecaf950
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_5.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DIZ)V
+.limit regs 10
+
+
+       aput-boolean v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d
new file mode 100644
index 0000000..db2bf25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_6.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIZ)V
+.limit regs 10
+
+
+       aput-boolean v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d
new file mode 100644
index 0000000..7e9ed2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_7.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZIZ)V
+.limit regs 10
+
+       aput-boolean v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d
new file mode 100644
index 0000000..bf92b91
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_8.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZFZ)V
+.limit regs 11
+
+       aput-boolean v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java
new file mode 100644
index 0000000..09606e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_boolean.d;
+
+public class T_aput_boolean_8 {
+    public void run(boolean[] arr, float idx, boolean value) {
+        
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d
new file mode 100644
index 0000000..e42fd3a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_boolean_9.java
+.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([ZIZ)V
+.limit regs 11
+
+       aput-boolean v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
new file mode 100644
index 0000000..3c43916
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_byte.d.T_aput_byte_1;
+import dot.junit.opcodes.aput_byte.d.T_aput_byte_8;
+
+public class Test_aput_byte extends DxTestCase {
+    /**
+     * @title put byte into array
+     */
+    public void testN1() {
+        T_aput_byte_1 t = new T_aput_byte_1();
+        byte[] arr = new byte[2];
+        t.run(arr, 1, (byte) 100);
+        assertEquals(100, arr[1]);
+    }
+
+    /**
+     * @title put byte into array
+     */
+    public void testN2() {
+        T_aput_byte_1 t = new T_aput_byte_1();
+        byte[] arr = new byte[2];
+        t.run(arr, 0, (byte) 100);
+        assertEquals(100, arr[0]);
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        byte[] arr = new byte[2];
+        T_aput_byte_8 t = new T_aput_byte_8();
+        try {
+            t.run(arr, 3.14f, (byte)1);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_byte_1 t = new T_aput_byte_1();
+        byte[] arr = new byte[2];
+        try {
+            t.run(arr, 2, (byte) 100);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_byte_1 t = new T_aput_byte_1();
+        try {
+            t.run(null, 2, (byte) 100);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_byte_1 t = new T_aput_byte_1();
+        byte[] arr = new byte[2];
+        try {
+            t.run(arr, -1, (byte) 100);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, short
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, short
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int, short
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, short
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, short
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B15 
+     * @title put value 128 into byte array
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d
new file mode 100644
index 0000000..097ae50
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_1.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BIB)V
+.limit regs 11
+
+       aput-byte v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java
new file mode 100644
index 0000000..57561be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_byte.d;
+
+public class T_aput_byte_1 {
+    public void run(byte[] arr, int idx, byte value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
new file mode 100644
index 0000000..b65ae76
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_10.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BIB)V
+.limit regs 11
+
+       const v10, 128
+       aput-byte v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d
new file mode 100644
index 0000000..55f781e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_2.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BDB)V
+.limit regs 11
+
+
+       aput-byte v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d
new file mode 100644
index 0000000..5684437
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_3.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BIJ)V
+.limit regs 11
+
+
+       aput-byte v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d
new file mode 100644
index 0000000..06e4eff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_4.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;IB)V
+.limit regs 10
+
+
+       aput-byte v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d
new file mode 100644
index 0000000..2835e5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_5.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DIB)V
+.limit regs 10
+
+
+       aput-byte v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d
new file mode 100644
index 0000000..66da57c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_6.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIB)V
+.limit regs 10
+
+
+       aput-byte v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d
new file mode 100644
index 0000000..4fb862b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_7.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BIB)V
+.limit regs 10
+
+       aput-byte v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d
new file mode 100644
index 0000000..0c4914e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_8.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BFB)V
+.limit regs 11
+
+       aput-byte v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java
new file mode 100644
index 0000000..00f9d64
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_byte.d;
+
+public class T_aput_byte_8 {
+    public void run(byte[] arr, float idx, byte value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d
new file mode 100644
index 0000000..e644e87
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_byte_9.java
+.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([BIB)V
+.limit regs 11
+
+       aput-byte v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java
new file mode 100644
index 0000000..4253346
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_char.d.T_aput_char_1;
+import dot.junit.opcodes.aput_char.d.T_aput_char_8;
+
+
+public class Test_aput_char extends DxTestCase {
+    /**
+     * @title put char into array
+     */
+    public void testN1() {
+        T_aput_char_1 t = new T_aput_char_1();
+        char[] arr = new char[2];
+        t.run(arr, 1, 'g');
+        assertEquals('g', arr[1]);
+    }
+
+    /**
+     * @title put char into array
+     */
+    public void testN2() {
+        T_aput_char_1 t = new T_aput_char_1();
+        char[] arr = new char[2];
+        t.run(arr, 0, 'g');
+        assertEquals('g', arr[0]);
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        char[] arr = new char[2];
+        T_aput_char_8 t = new T_aput_char_8();
+        try {
+            t.run(arr, 3.14f, 'g');
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_char_1 t = new T_aput_char_1();
+        char[] arr = new char[2];
+        try {
+            t.run(arr, 2, 'g');
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_char_1 t = new T_aput_char_1();
+        try {
+            t.run(null, 2, 'g');
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_char_1 t = new T_aput_char_1();
+        char[] arr = new char[2];
+        try {
+            t.run(arr, -1, 'g');
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+ 
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, char
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, char
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int, char
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, char
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, char
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B15 
+     * @title put value 65536 into char array
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d
new file mode 100644
index 0000000..409eade
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_1.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CIC)V
+.limit regs 11
+
+       aput-char v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java
new file mode 100644
index 0000000..65f4cd3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_char.d;
+
+public class T_aput_char_1 {
+    public void run(char[] arr, int idx, char value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
new file mode 100644
index 0000000..dd68792
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_10.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CIC)V
+.limit regs 11
+
+       const v10, 65536
+       aput-char v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d
new file mode 100644
index 0000000..0408006
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_2.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CDC)V
+.limit regs 11
+
+
+       aput-char v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d
new file mode 100644
index 0000000..5010da6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_3.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CIJ)V
+.limit regs 11
+
+
+       aput-char v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d
new file mode 100644
index 0000000..67d67ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_4.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;IC)V
+.limit regs 10
+
+
+       aput-char v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d
new file mode 100644
index 0000000..cd0384a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_5.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DIC)V
+.limit regs 10
+
+
+       aput-char v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d
new file mode 100644
index 0000000..2a2381d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_6.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIC)V
+.limit regs 10
+
+
+       aput-char v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d
new file mode 100644
index 0000000..b1e4c9f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_7.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CIC)V
+.limit regs 10
+
+       aput-char v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d
new file mode 100644
index 0000000..f78376d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_8.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CFC)V
+.limit regs 11
+
+       aput-char v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java
new file mode 100644
index 0000000..ea02ba1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_char.d;
+
+public class T_aput_char_8 {
+    public void run(char[] arr, float idx, char value) {
+        
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d
new file mode 100644
index 0000000..1077039
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_char_9.java
+.class public dot.junit.opcodes.aput_char.d.T_aput_char_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([CIC)V
+.limit regs 11
+
+       aput-char v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/Test_aput_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/Test_aput_object.java
new file mode 100644
index 0000000..cb50224
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/Test_aput_object.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_object.d.T_aput_object_1;
+import dot.junit.opcodes.aput_object.d.T_aput_object_12;
+import dot.junit.opcodes.aput_object.d.T_aput_object_2;
+import dot.junit.opcodes.aput_object.d.T_aput_object_3;
+import dot.junit.opcodes.aput_object.d.T_aput_object_4;
+
+public class Test_aput_object extends DxTestCase {
+    /**
+     * @title put reference into array
+     */
+    public void testN1() {
+        T_aput_object_1 t = new T_aput_object_1();
+        String[] arr = new String[2];
+        t.run(arr, 0, "hello");
+        assertEquals("hello", arr[0]);
+    }
+
+    /**
+     * @title put reference into array
+     */
+    public void testN2() {
+        T_aput_object_1 t = new T_aput_object_1();
+        String[] value = {"world", null, ""};
+        String[] arr = new String[2];
+        for (int i = 0; i < value.length; i++) {
+            t.run(arr, 1, value[i]);
+            assertEquals(value[i], arr[1]);
+        }
+    }
+
+    /**
+     * @title put reference into array
+     */
+    public void testN3() {
+        T_aput_object_2 t = new T_aput_object_2();
+        Integer[] arr = new Integer[2];
+        Integer value = new Integer(12345);
+        t.run(arr, 0, value);
+        assertEquals(value, arr[0]);
+    }
+
+    /**
+     * @title Check assignement compatibility rules
+     */
+    public void testN4() {
+        T_aput_object_3 t = new T_aput_object_3();
+        assertEquals(3, t.run());
+
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        String[] arr = new String[2];
+        T_aput_object_12 t = new T_aput_object_12();
+        try {
+            t.run(arr, 3.14f, new String());
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_object_1 t = new T_aput_object_1();
+        String[] arr = new String[2];
+        try {
+            t.run(arr, arr.length, "abc");
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE2() {
+        T_aput_object_1 t = new T_aput_object_1();
+        String[] arr = new String[2];
+        try {
+            t.run(arr, -1, "abc");
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE3() {
+        T_aput_object_1 t = new T_aput_object_1();
+        String[] arr = null;
+        try {
+            t.run(arr, 0, "abc");
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayStoreException
+     */
+    public void testE4() {
+        T_aput_object_4 t = new T_aput_object_4();
+        String[] arr = new String[2];
+        try {
+            t.run(arr, 0, t);
+            fail("expected ArrayStoreException");
+        } catch (ArrayStoreException aie) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, String
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, String
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float[], int, String
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, String
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, String
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B15 
+     * @title put integer into array of references
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_object.d.T_aput_object_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d
new file mode 100644
index 0000000..c629f3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_1.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;ILjava/lang/String;)V
+.limit regs 11
+
+       aput-object v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java
new file mode 100644
index 0000000..1361e82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object.d;
+
+public class T_aput_object_1 {
+
+    public void run(String[] arr, int idx, String value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d
new file mode 100644
index 0000000..a11e1ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_10.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;ILjava/lang/String;)V
+.limit regs 10
+
+       aput-object v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d
new file mode 100644
index 0000000..1b4f7ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_11.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;ILjava/lang/String;)V
+.limit regs 11
+
+       aput-object v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d
new file mode 100644
index 0000000..35160aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_12.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;FLjava/lang/String;)V
+.limit regs 11
+
+       aput-object v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java
new file mode 100644
index 0000000..f55edbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object.d;
+
+public class T_aput_object_12 {
+
+    public void run(String[] arr, float idx, String value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d
new file mode 100644
index 0000000..f9670ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_13.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;ILjava/lang/String;)V
+.limit regs 11
+
+       const v10, 1
+       aput-object v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d
new file mode 100644
index 0000000..4e1cad0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_2.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/Integer;ILjava/lang/Integer;)V
+.limit regs 11
+
+       aput-object v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java
new file mode 100644
index 0000000..4b2204e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object.d;
+
+public class T_aput_object_2 {
+    
+    public void run(Integer[] arr, int idx, Integer value) {
+        arr[idx] = value;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d
new file mode 100644
index 0000000..4b2642d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d
@@ -0,0 +1,132 @@
+; Copyright (C) 2008 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.
+
+.source TestStubs.java
+.interface abstract dot.junit.opcodes.aput_object.d.SuperInterface
+
+.source TestStubs.java
+.interface public dot.junit.opcodes.aput_object.d.SuperInterface2
+    
+.source TestStubs.java    
+.class public dot.junit.opcodes.aput_object.d.SuperClass 
+.super java/lang/Object
+.implements dot.junit.opcodes.aput_object.d.SuperInterface
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+    
+.source TestStubs.java
+.class public dot.junit.opcodes.aput_object.d.SubClass 
+.super dot.junit.opcodes.aput_object.d.SuperClass
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/aput_object/d/SuperClass/<init>()V
+       return-void
+.end method
+
+
+.source T_aput_object_3.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 32
+
+    const v1, 0
+
+    const v0, 1
+    ; v2 = SubClass[]
+    new-array v2, v0, [Ldot/junit/opcodes/aput_object/d/SubClass;
+    
+    ; v3 =  SuperClass[]
+    new-array v3, v0, [Ldot/junit/opcodes/aput_object/d/SuperClass;
+
+    ; v4 =     SubClass
+    new-instance v4, dot/junit/opcodes/aput_object/d/SubClass
+    invoke-direct {v4}, dot/junit/opcodes/aput_object/d/SubClass/<init>()V
+
+    ; v5 =     SuperClass
+    new-instance v5, dot/junit/opcodes/aput_object/d/SuperClass
+    invoke-direct {v5}, dot/junit/opcodes/aput_object/d/SuperClass/<init>()V
+
+    ; v6 = SuperInterface[]
+    new-array v6, v0, [Ldot/junit/opcodes/aput_object/d/SuperInterface;
+
+    ; v7 =     Object[]
+    new-array v7, v0, [Ljava/lang/Object;
+    
+    ; v8 = SuperInterface2[]
+    new-array v8, v0, [Ldot/junit/opcodes/aput_object/d/SuperInterface2;
+    
+    const/4 v0, 0
+    
+; (SubClass -> SuperClass[])
+    aput-object v4, v3, v0
+    
+; (SubClass -> SuperInterface[])
+    aput-object v4, v6, v0
+    
+; (SubClass -> Object[])
+    aput-object v4, v7, v0
+        
+; !(SuperClass -> SubClass[])    
+Label10:        
+    aput-object v5, v2, v0
+Label11:    
+    goto Label2
+Label12:
+    add-int/lit8 v1, v1, 1
+    goto Label2
+        
+; !(SuperClass -> SuperInterface2[])    
+Label2:
+Label20:    
+    aput-object v5, v8, v0
+Label21:    
+    goto Label3
+Label22:
+    add-int/lit8 v1, v1, 1
+    goto Label3
+
+; !(SubClass[] -> SuperInterface[])    
+Label3:
+Label30:    
+    aput-object v2, v6, v0
+Label31:    
+    goto Label4
+Label32:    
+    add-int/lit8 v1, v1, 1
+    goto Label4
+
+Label4:
+    return v1
+    
+.catch java/lang/ArrayStoreException from Label10 to Label11 using Label12
+.catch java/lang/ArrayStoreException from Label20 to Label21 using Label22
+.catch java/lang/ArrayStoreException from Label30 to Label31 using Label32
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java
new file mode 100644
index 0000000..1a90fd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object.d;
+
+public class T_aput_object_3 {
+    
+    public int run() {
+        return 3;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d
new file mode 100644
index 0000000..f79b817
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_4.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;ILjava/lang/Object;)V
+.limit regs 11
+       aput-object v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java
new file mode 100644
index 0000000..52e935b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_object.d;
+
+public class T_aput_object_4 {
+
+//  public void run(Integer[] arr, int idx) {
+    /* similar to
+     * Object x[] = new String[3];
+     * x[0] = new Integer(0);
+     */
+//  }
+    
+    public void run(String[] arr, int idx, Object a) {
+        //arr[idx] = a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d
new file mode 100644
index 0000000..441ac56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_5.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;DLjava/lang/String;)V
+.limit regs 11
+
+       aput-object v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d
new file mode 100644
index 0000000..5786bbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_6.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/String;IJ)V
+.limit regs 11
+
+       aput-object v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d
new file mode 100644
index 0000000..dfdc953
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_7.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;ILjava/lang/String;)V
+.limit regs 11
+
+       aput-object v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d
new file mode 100644
index 0000000..e6259bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_8.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([FILjava/lang/String;)V
+.limit regs 10
+
+       aput-object v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d
new file mode 100644
index 0000000..96bced3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_object_9.java
+.class public dot.junit.opcodes.aput_object.d.T_aput_object_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JILjava/lang/String;)V
+.limit regs 10
+
+       aput-object v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java
new file mode 100644
index 0000000..350d999
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_short.d.T_aput_short_1;
+import dot.junit.opcodes.aput_short.d.T_aput_short_8;
+
+public class Test_aput_short extends DxTestCase {
+    /**
+     * @title put short into array
+     */
+    public void testN1() {
+        T_aput_short_1 t = new T_aput_short_1();
+        short[] arr = new short[2];
+        t.run(arr, 1, (short) 10000);
+        assertEquals(10000, arr[1]);
+    }
+
+    /**
+     * @title put short into array
+     */
+    public void testN2() {
+        T_aput_short_1 t = new T_aput_short_1();
+        short[] arr = new short[2];
+        t.run(arr, 0, (short) 10000);
+        assertEquals(10000, arr[0]);
+    }
+
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN3() {
+        short[] arr = new short[2];
+        T_aput_short_8 t = new T_aput_short_8();
+        try {
+            t.run(arr, 3.14f, (short)111);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_short_1 t = new T_aput_short_1();
+        short[] arr = new short[2];
+        try {
+            t.run(arr, 2, (short) 10000);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_short_1 t = new T_aput_short_1();
+        try {
+            t.run(null, 2, (short) 10000);
+            fail("expected NullPointerException");
+        } catch (NullPointerException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_short_1 t = new T_aput_short_1();
+        short[] arr = new short[2];
+        try {
+            t.run(arr, -1, (short) 10000);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double[], int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long[], int, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, int
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B15 
+     * @title put value 32768 into array of shorts
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d
new file mode 100644
index 0000000..f89cbb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_1.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SIS)V
+.limit regs 11
+
+       aput-short v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java
new file mode 100644
index 0000000..42cefa9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_short.d;
+
+public class T_aput_short_1 {
+    public void run(short[] arr, int idx, short value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
new file mode 100644
index 0000000..bbb541c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_10.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SIS)V
+.limit regs 11
+
+       const v10, 32768    
+       aput-short v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d
new file mode 100644
index 0000000..9d63757
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_2.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SDS)V
+.limit regs 11
+
+
+       aput-short v10, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d
new file mode 100644
index 0000000..c9990b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_3.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SIJ)V
+.limit regs 11
+
+
+       aput-short v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d
new file mode 100644
index 0000000..24b2d92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_4.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;IS)V
+.limit regs 10
+
+
+       aput-short v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d
new file mode 100644
index 0000000..4a9dabc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_5.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DIS)V
+.limit regs 10
+
+
+       aput-short v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d
new file mode 100644
index 0000000..ed8cfd3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_6.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIS)V
+.limit regs 10
+
+
+       aput-short v9, v7, v8
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d
new file mode 100644
index 0000000..9927025
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_7.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SIS)V
+.limit regs 10
+
+       aput-short v9, v7, v6
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d
new file mode 100644
index 0000000..099de06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_8.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SFS)V
+.limit regs 11
+
+       aput-short v10, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java
new file mode 100644
index 0000000..e973865
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_short.d;
+
+public class T_aput_short_8 {
+    public void run(short[] arr, float idx, short value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d
new file mode 100644
index 0000000..46efab3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_short_9.java
+.class public dot.junit.opcodes.aput_short.d.T_aput_short_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([SIS)V
+.limit regs 11
+
+       aput-short v11, v8, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java
new file mode 100644
index 0000000..4b7f0ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.aput_wide.d.T_aput_wide_1;
+import dot.junit.opcodes.aput_wide.d.T_aput_wide_2;
+import dot.junit.opcodes.aput_wide.d.T_aput_wide_6;
+import dot.junit.opcodes.aput_wide.d.T_aput_wide_9;
+
+
+public class Test_aput_wide extends DxTestCase {
+    /**
+     * @title put long into array
+     */
+    public void testN1() {
+        T_aput_wide_1 t = new T_aput_wide_1();
+        long[] arr = new long[2];
+        t.run(arr, 1, 100000000000l);
+        assertEquals(100000000000l, arr[1]);
+    }
+
+    /**
+     * @title put long into array
+     */
+    public void testN2() {
+        T_aput_wide_1 t = new T_aput_wide_1();
+        long[] arr = new long[2];
+        t.run(arr, 0, 100000000000l);
+        assertEquals(100000000000l, arr[0]);
+    }
+
+    /**
+     * @title put double into array
+     */
+    public void testN3() {
+        T_aput_wide_2 t = new T_aput_wide_2();
+        double[] arr = new double[2];
+        t.run(arr, 0, 3.1415d);
+        assertEquals(3.1415d, arr[0]);
+    }
+    
+    /**
+     * @title Type of index argument - float. Dalvik doens't distinguish 64-bits types internally,
+     * so this array[float]=value makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        long[] arr = new long[2];
+        T_aput_wide_9 t = new T_aput_wide_9();
+        try {
+            t.run(arr, 3.14f, 111);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Try to put long into double[]. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation makes no sense but shall not crash the VM.
+     */
+    public void testN5() {
+        double[] arr = new double[2];
+        T_aput_wide_6 t = new T_aput_wide_6();
+        try {
+            t.run(arr, 0, 1234l);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException
+     */
+    public void testE1() {
+        T_aput_wide_1 t = new T_aput_wide_1();
+        long[] arr = new long[2];
+        try {
+            t.run(arr, 2, 100000000000l);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_aput_wide_1 t = new T_aput_wide_1();
+        try {
+            t.run(null, 1, 100000000000l);
+            fail("expected NullPointerException");
+        } catch (NullPointerException np) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected ArrayIndexOutOfBoundsException (negative index)
+     */
+    public void testE3() {
+        T_aput_wide_1 t = new T_aput_wide_1();
+        long[] arr = new long[2];
+        try {
+            t.run(arr, -1, 100000000000l);
+            fail("expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, double, long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, int, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - object, int, long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int[], int, long
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - array, reference, long
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.aput_wide.d.T_aput_wide_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d
new file mode 100644
index 0000000..2890417
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_1.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java
new file mode 100644
index 0000000..385db2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_wide.d;
+
+public class T_aput_wide_1 {
+
+    public void run(long[] arr, int idx, long value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d
new file mode 100644
index 0000000..bf314a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_10.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIJ)V
+.limit regs 14
+
+       aput-wide v14, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d
new file mode 100644
index 0000000..793338f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_2.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DID)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java
new file mode 100644
index 0000000..e333794
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_wide.d;
+
+public class T_aput_wide_2 {
+
+    public void run(double[] arr, int idx, double value) {
+        arr[idx] = value;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d
new file mode 100644
index 0000000..4486392
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_3.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JDJ)V
+.limit regs 14
+
+       aput-wide v12, v9, v10
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d
new file mode 100644
index 0000000..980724f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_4.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JII)V
+.limit regs 14
+
+       aput-wide v13, v11, v12
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d
new file mode 100644
index 0000000..f4d3354
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_5.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;IJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d
new file mode 100644
index 0000000..e5f58d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_6.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([DIJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java
new file mode 100644
index 0000000..d1466a3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_wide.d;
+
+public class T_aput_wide_6 {
+
+    public void run(double[] arr, int idx, long value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d
new file mode 100644
index 0000000..c862b0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_7.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([IIJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d
new file mode 100644
index 0000000..06e1aa0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_8.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JIJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v9
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d
new file mode 100644
index 0000000..41777df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_aput_wide_9.java
+.class public dot.junit.opcodes.aput_wide.d.T_aput_wide_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([JFJ)V
+.limit regs 14
+
+       aput-wide v12, v10, v11
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java
new file mode 100644
index 0000000..c08f9be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.aput_wide.d;
+
+public class T_aput_wide_9 {
+
+    public void run(long[] arr, float idx, long value) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/Test_array_length.java b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/Test_array_length.java
new file mode 100644
index 0000000..f49cccb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/Test_array_length.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.array_length;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.array_length.d.T_array_length_1;
+import dot.junit.opcodes.array_length.d.T_array_length_4;
+
+
+public class Test_array_length extends DxTestCase {
+    /**
+     * @title get length of array of references
+     */
+    public void testN1() {
+        T_array_length_1 t = new T_array_length_1();
+        String[] a = new String[5];
+        assertEquals(5, t.run(a));
+    }
+    
+    /**
+     * @title get length of array of doubles
+     */
+    public void testN2() {
+        T_array_length_4 t = new T_array_length_4();
+        double[] a = new double[10];
+        assertEquals(10, t.run(a));
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testNPE1() {
+        T_array_length_1 t = new T_array_length_1();
+        try {
+            t.run(null);
+            fail("NPE expected");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - Object
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dxc.junit.opcodes.array_length.jm.T_array_length_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dxc.junit.opcodes.array_length.jm.T_array_length_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dxc.junit.opcodes.array_length.jm.T_array_length_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.d
new file mode 100644
index 0000000..3981009
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_array_length_1.java
+.class public dot.junit.opcodes.array_length.d.T_array_length_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/Object;)I
+.limit regs 5
+
+       array-length v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.java
new file mode 100644
index 0000000..fd30072
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.array_length.d;
+
+public class T_array_length_1 {
+
+    public int run(Object[] arr) {
+        return arr.length;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_2.d
new file mode 100644
index 0000000..b1b015c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_array_length_2.java
+.class public dot.junit.opcodes.array_length.d.T_array_length_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)I
+.limit regs 5
+
+       array-length v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_3.d
new file mode 100644
index 0000000..01bdaf0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_array_length_3.java
+.class public dot.junit.opcodes.array_length.d.T_array_length_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)I
+.limit regs 5
+    
+       const v4, 1234
+       array-length v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.d
new file mode 100644
index 0000000..af48dfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_array_length_4.java
+.class public dot.junit.opcodes.array_length.d.T_array_length_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([D)I
+.limit regs 5
+
+       array-length v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.java
new file mode 100644
index 0000000..b3fa51f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.array_length.d;
+
+public class T_array_length_4 {
+
+    public int run(double[] arr) {
+        return arr.length;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_5.d
new file mode 100644
index 0000000..c7b1f9e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/array_length/d/T_array_length_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_array_length_5.java
+.class public dot.junit.opcodes.array_length.d.T_array_length_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/Object;)V
+.limit regs 5
+
+       array-length v5, v4
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/TestStubs.java
new file mode 100644
index 0000000..67f8f04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/TestStubs.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast;
+
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/Test_check_cast.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/Test_check_cast.java
new file mode 100644
index 0000000..78a0479
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/Test_check_cast.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.check_cast.d.T_check_cast_1;
+import dot.junit.opcodes.check_cast.d.T_check_cast_2;
+import dot.junit.opcodes.check_cast.d.T_check_cast_3;
+import dot.junit.opcodes.check_cast.d.T_check_cast_7;
+
+
+public class Test_check_cast extends DxTestCase {
+   
+    
+    /**
+     * @title (String)(Object)String
+     */
+    public void testN1() {
+        T_check_cast_1 t = new T_check_cast_1();
+        String s = "";
+        assertEquals(s, t.run(s));
+    }
+
+    /**
+     * @title (String)(Object)null
+     */
+    public void testN2() {
+        T_check_cast_1 t = new T_check_cast_1();
+        assertNull(t.run(null));
+    }
+
+    /**
+     * @title check assignment compatibility rules
+     */
+    public void testN4() {
+        T_check_cast_2 t = new T_check_cast_2();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title expected ClassCastException
+     */
+    public void testE1() {
+        T_check_cast_1 t = new T_check_cast_1();
+        try {
+            t.run(t);
+            fail("expected ClassCastException");
+        } catch (ClassCastException iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A18 
+     * @title  constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.check_cast.d.T_check_cast_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.check_cast.d.T_check_cast_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.check_cast.d.T_check_cast_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.check_cast.d.T_check_cast_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to access inaccessible class, expect throws IllegalAccessError
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.check_cast.TestStubs
+        //@uses dot.junit.opcodes.check_cast.d.T_check_cast_3
+        T_check_cast_3 t = new T_check_cast_3();
+        try {
+            t.run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to access undefined class, expect throws NoClassDefFoundError on
+     * first access
+     */
+    public void testVFE6() {
+        T_check_cast_7 t = new T_check_cast_7();
+        try {
+            t.run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError iae) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint A18 
+     * @title  constant pool type
+     */    
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.check_cast.d.T_check_cast_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d
new file mode 100644
index 0000000..9c2f074
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_1.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)Ljava/lang/String;
+.limit regs 5
+
+       check-cast v4, java/lang/String
+       return-object v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java
new file mode 100644
index 0000000..4387def
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast.d;
+
+public class T_check_cast_1 {
+
+    public String run(Object o) {
+        return (String)o;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d
new file mode 100644
index 0000000..b7472cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d
@@ -0,0 +1,149 @@
+; Copyright (C) 2008 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.
+
+.source TestStubs.java
+.interface public dot.junit.opcodes.check_cast.d.T_check_cast_2.SuperInterface
+
+.source TestStubs.java    
+.interface public dot.junit.opcodes.check_cast.d.T_check_cast_2.SuperInterface2
+
+.source TestStubs.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_2.SuperClass 
+.super java/lang/Object
+.implements dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperInterface
+    
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method    
+
+.source TestStubs.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_2.SubClass 
+.super dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass/<init>()V
+       return-void
+.end method
+
+
+.source T_check_cast_2.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 20
+
+    const v1, 0
+    
+; (SubClass instanceof SuperClass)    
+    new-instance v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass/<init>()V
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass
+    
+; (SubClass[] instanceof SuperClass[])    
+    const v11, 1
+    new-array v10, v11, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass;
+    check-cast v10, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass;
+
+    
+; (SubClass[] instanceof Object)    
+    new-array v10, v11, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass;
+    check-cast v10, java/lang/Object
+    
+; (SubClass instanceof SuperInterface)    
+    new-instance v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass/<init>()V    
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperInterface
+        
+
+; !(SuperClass instanceof SubClass)    
+Label1:
+    new-instance v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass
+    invoke-direct {v10}, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass/<init>()V
+Label10:    
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass
+Label11:    
+    goto Label2
+Label12:
+    add-int/lit16 v1, v1, 1
+    goto Label2
+        
+; !(SubClass instanceof SuperInterface2)    
+Label2:
+    new-instance v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass/<init>()V    
+Label20:    
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperInterface2
+Label21:    
+    goto Label3
+Label22:
+    add-int/lit16 v1, v1, 1
+    goto Label3
+
+; !(SubClass[] instanceof SuperInterface)    
+Label3:
+    new-array v10, v11, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass;
+Label30:    
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SuperInterface
+Label31:    
+    goto Label4
+Label32:    
+    add-int/lit16 v1, v1, 1
+    goto Label4
+
+; !(SubClass[] instanceof SubClass)    
+Label4:
+    new-array v10, v11, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass;
+Label40:    
+    check-cast v10, dot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass
+Label41:    
+    goto Label5
+Label42:
+    add-int/lit16 v1, v1, 1
+    goto Label5    
+    
+; !(SuperClass[] instanceof SubClass[])    
+Label5:
+    new-array v10, v11, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SuperClass;
+Label50:    
+    check-cast v10, [Ldot/junit/opcodes/check_cast/d/T_check_cast_2/SubClass;
+Label51:    
+    goto Label6
+Label52:
+    add-int/lit16 v1, v1, 1
+    
+Label6:        
+    return v1
+    
+.catch java/lang/ClassCastException from Label10 to Label11 using Label12
+.catch java/lang/ClassCastException from Label20 to Label21 using Label22
+.catch java/lang/ClassCastException from Label30 to Label31 using Label32
+.catch java/lang/ClassCastException from Label40 to Label41 using Label42
+.catch java/lang/ClassCastException from Label50 to Label51 using Label52
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java
new file mode 100644
index 0000000..5e55188
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast.d;
+
+public class T_check_cast_2 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d
new file mode 100644
index 0000000..d269a31
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_3.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+       check-cast v5, dot/junit/opcodes/check_cast/TestStubs
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java
new file mode 100644
index 0000000..4c4f153
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast.d;
+
+public class T_check_cast_3 {
+
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d
new file mode 100644
index 0000000..77e28d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_4.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)Ljava/lang/String;
+.limit regs 5
+
+       check-cast v4, java/lang/String
+       return-object v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh
new file mode 100644
index 0000000..ed092c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh
@@ -0,0 +1,264 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/check_cast/d/T_check_cast_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/check_cast/d/T_check_cast_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 1f0a4ad6
+    D6 4A 0A 1F 
+// parsed: offset 12, len 20: signature           : c885...5be2
+    C8 85 20 53 64 78 EF B4 92 49 06 A9 EC FA 7E 44 D0 A3 5B E2 
+// parsed: offset 32, len 4: file_size           : 576
+    40 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 440 (0x0001b8)
+    B8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 336
+    50 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "LL"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 306 (0x000132) "Ldot/junit/opcodes/check_cast/d/T_check_cast_4;"
+    32 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 355 (0x000163) "Ljava/lang/Object;"
+    63 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 375 (0x000177) "Ljava/lang/String;"
+    77 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "T_check_cast_4.java"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 416 (0x0001a0) "V"
+    A0 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 419 (0x0001a3) "run"
+    A3 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/check_cast/d/T_check_cast_4;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "LL"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 288 (0x000120)
+    01 00 00 00 02 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/check_cast/d/T_check_cast_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_check_cast_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 424 (0x0001a8)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 A8 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.check_cast.d.T_check_cast_4.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.check_cast.d.T_check_cast_4.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: check-cast v4, Ljava/lang/String; // class@0002
+//@mod            1F 04 02 00 
+            1F 04 02 01 
+        // parsed: offset 284, len 2: |0002: return-object v4
+            11 04 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 4: TYPE_STRING_DATA_ITEM [1] "LL"
+    02 4C 4C 00 
+// parsed: offset 306, len 49: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/check_cast/d/T_check_cast_4;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 63 68 65 63 6B 5F 63 61 73 74 2F 64 2F 54 5F 63 68 65 63 6B 5F 63 61 73 74 5F 34 3B 00 
+// parsed: offset 355, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 375, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 395, len 21: TYPE_STRING_DATA_ITEM [5] "T_check_cast_4.java"
+    13 54 5F 63 68 65 63 6B 5F 63 61 73 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 416, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 419, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/check_cast/d/T_check_cast_4;"
+    // parsed: offset 424, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 425, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 426, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 427, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 428, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 429, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 432, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 434, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 435, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 436, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 438, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 440, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 444, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 456, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 468, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 480, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 492, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 504, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 516, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 528, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 540, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 552, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 20 00 00 01 00 00 00 A8 01 00 00 
+    // parsed: offset 564, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 440 (0x0001b8)
+        00 10 00 00 01 00 00 00 B8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d
new file mode 100644
index 0000000..b76a68e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_5.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+       const v3, 1234
+       check-cast v3, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d
new file mode 100644
index 0000000..7e26639
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_6.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+
+       check-cast v5, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d
new file mode 100644
index 0000000..8c7af68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_7.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       check-cast v5, dot/junit/opcodes/check_cast/Test_check_castN
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java
new file mode 100644
index 0000000..fa941a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.check_cast.d;
+
+public class T_check_cast_7 {
+
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d
new file mode 100644
index 0000000..645436f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_8.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+       const-wide v0, 1234
+       check-cast v0, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d
new file mode 100644
index 0000000..e44cc10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_check_cast_9.java
+.class public dot.junit.opcodes.check_cast.d.T_check_cast_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)Ljava/lang/String;
+.limit regs 5
+
+       check-cast v4, java/lang/String
+       return-object v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh
new file mode 100644
index 0000000..419f6e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh
@@ -0,0 +1,264 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/check_cast/d/T_check_cast_9.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/check_cast/d/T_check_cast_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : d6bb4b2e
+    2E 4B BB D6 
+// parsed: offset 12, len 20: signature           : 1ebe...570d
+    1E BE 42 FD BC AF 7F 9D AB 10 86 B8 F1 D5 98 36 F6 E6 57 0D 
+// parsed: offset 32, len 4: file_size           : 576
+    40 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 440 (0x0001b8)
+    B8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 336
+    50 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "LL"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 306 (0x000132) "Ldot/junit/opcodes/check_cast/d/T_check_cast_9;"
+    32 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 355 (0x000163) "Ljava/lang/Object;"
+    63 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 375 (0x000177) "Ljava/lang/String;"
+    77 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "T_check_cast_9.java"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 416 (0x0001a0) "V"
+    A0 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 419 (0x0001a3) "run"
+    A3 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/check_cast/d/T_check_cast_9;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "LL"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 288 (0x000120)
+    01 00 00 00 02 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/check_cast/d/T_check_cast_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_check_cast_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 424 (0x0001a8)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 A8 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.check_cast.d.T_check_cast_9.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.check_cast.d.T_check_cast_9.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: check-cast v4, Ljava/lang/String; // class@0002
+//@mod            1F 04 02 00 
+            1F 04 03 00 
+        // parsed: offset 284, len 2: |0002: return-object v4
+            11 04 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 4: TYPE_STRING_DATA_ITEM [1] "LL"
+    02 4C 4C 00 
+// parsed: offset 306, len 49: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/check_cast/d/T_check_cast_9;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 63 68 65 63 6B 5F 63 61 73 74 2F 64 2F 54 5F 63 68 65 63 6B 5F 63 61 73 74 5F 39 3B 00 
+// parsed: offset 355, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 375, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 395, len 21: TYPE_STRING_DATA_ITEM [5] "T_check_cast_9.java"
+    13 54 5F 63 68 65 63 6B 5F 63 61 73 74 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 416, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 419, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/check_cast/d/T_check_cast_9;"
+    // parsed: offset 424, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 425, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 426, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 427, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 428, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 429, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 432, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 434, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 435, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 436, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 438, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 440, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 444, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 456, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 468, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 480, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 492, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 504, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 516, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 528, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 540, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 552, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 20 00 00 01 00 00 00 A8 01 00 00 
+    // parsed: offset 564, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 440 (0x0001b8)
+        00 10 00 00 01 00 00 00 B8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java
new file mode 100644
index 0000000..e2a1994
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmp_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.cmp_long.d.T_cmp_long_1;
+import dot.junit.opcodes.cmp_long.d.T_cmp_long_2;
+
+public class Test_cmp_long extends DxTestCase {
+    /**
+     * @title Arguments = 111234567891l > 111234567890l
+     */
+    public void testN1() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(1, t.run(111234567891l, 111234567890l));
+    }
+
+    /**
+     * @title Arguments = 112234567890 = 112234567890
+     */
+    public void testN2() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(0, t.run(112234567890l, 112234567890l));
+    }
+
+    /**
+     * @title Arguments = 112234567890 < 998876543210
+     */
+    public void testN3() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(-1, t.run(112234567890l, 998876543210l));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this comparison of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+         T_cmp_long_2 t = new T_cmp_long_2();
+        try {
+            t.run(123l, 3.145f);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Arguments = Long.MAX_VALUE > Long.MIN_VALUE
+     */
+    public void testB1() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(1, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE < Long.MAX_VALUE
+     */
+    public void testB2() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(-1, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1 > 0
+     */
+    public void testB3() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(1, t.run(1l, 0l));
+    }
+
+    /**
+     * @title Arguments = 0 > -1
+     */
+    public void testB4() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(1, t.run(0l, -1l));
+    }
+
+    /**
+     * @title Arguments = -1 < 0
+     */
+    public void testB5() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(-1, t.run(-1l, 0l));
+    }
+
+    /**
+     * @title Arguments = 0 = 0
+     */
+    public void testB6() {
+        T_cmp_long_1 t = new T_cmp_long_1();
+        assertEquals(0, t.run(0l, 0l));
+    }
+
+
+    /**
+     * @constraint B1
+     * @title types of arguments - float, long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.cmp_long.d.T_cmp_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.cmp_long.d.T_cmp_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.cmp_long.d.T_cmp_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.cmp_long.d.T_cmp_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d
new file mode 100644
index 0000000..60b9654
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_1.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)I
+.limit regs 14
+
+       cmp-long v0, v10, v12
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java
new file mode 100644
index 0000000..10a78e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmp_long.d;
+
+public class T_cmp_long_1 {
+
+    public int run(long a, long b) {
+        if (a > b)   return 1;
+        if (a == b)  return 0;
+        return -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d
new file mode 100644
index 0000000..e3bdfd4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_2.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)I
+.limit regs 14
+
+       cmp-long v0, v10, v12
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java
new file mode 100644
index 0000000..4674e7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmp_long.d;
+
+public class T_cmp_long_2 {
+
+    public int run(long a, double b) {
+        return -2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d
new file mode 100644
index 0000000..3d25d6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_3.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)I
+.limit regs 14
+
+       const v10, 3.1415
+       cmp-long v0, v10, v12
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d
new file mode 100644
index 0000000..32c3050
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_4.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)I
+.limit regs 14
+
+       const v10, 1234
+       cmp-long v0, v10, v12
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d
new file mode 100644
index 0000000..9e86284
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_5.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)I
+.limit regs 14
+
+       const v10, 1234
+       cmp-long v0, v9, v12
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d
new file mode 100644
index 0000000..15ac1cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmp_long_6.java
+.class public dot.junit.opcodes.cmp_long.d.T_cmp_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)I
+.limit regs 14
+
+       cmp-long v0, v10, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java
new file mode 100644
index 0000000..fbf47a3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.cmpg_double.d.T_cmpg_double_1;
+import dot.junit.opcodes.cmpg_double.d.T_cmpg_double_3;
+
+public class Test_cmpg_double extends DxTestCase {
+    /**
+     * @title Arguments = 3.14d, 2.7d
+     */
+    public void testN1() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(1, t.run(3.14d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = -3.14d, 2.7d
+     */
+    public void testN2() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(-1, t.run(-3.14d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = 3.14, 3.14
+     */
+    public void testN3() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(0, t.run(3.14d, 3.14d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this comparison of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_cmpg_double_3 t = new T_cmpg_double_3();
+        try {
+            t.run(123l, 3.145d);
+        } catch (Throwable e) {
+        }
+    }  
+
+    /**
+     * @title Arguments = Double.NaN, Double.MAX_VALUE
+     */
+    public void testB1() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(1, t.run(Double.NaN, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB2() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(0, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Double.NEGATIVE_INFINITY, Double.MIN_VALUE
+     */
+    public void testB3() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(-1, t.run(Double.NEGATIVE_INFINITY, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, Double.MAX_VALUE
+     */
+    public void testB4() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(1, t.run(Double.POSITIVE_INFINITY, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY
+     */
+    public void testB5() {
+        T_cmpg_double_1 t = new T_cmpg_double_1();
+        assertEquals(1, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, float
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_double.d.T_cmpg_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_double.d.T_cmpg_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_double.d.T_cmpg_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_double.d.T_cmpg_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d
new file mode 100644
index 0000000..a76c3b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_1.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       cmpg-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java
new file mode 100644
index 0000000..8488914
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_double.d;
+
+public class T_cmpg_double_1 {
+
+    public int run(double a, double b) {
+        if(a > b)
+            return 1;
+        if(a == b)
+            return 0;
+        return -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d
new file mode 100644
index 0000000..5704511
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_2.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       const v14, 3.14
+       cmpg-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d
new file mode 100644
index 0000000..78d65ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_3.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)I
+.limit regs 16
+
+       cmpg-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java
new file mode 100644
index 0000000..d5b8ca5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_double.d;
+
+public class T_cmpg_double_3 {
+
+    public int run(long a, double b) {
+        return -2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d
new file mode 100644
index 0000000..e38307c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_4.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       const-wide v12, 12356
+       cmpg-double v0, v12, v11
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d
new file mode 100644
index 0000000..bd43151
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_5.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       cmpg-double v0, v12, v16
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d
new file mode 100644
index 0000000..70c7f72
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_double_6.java
+.class public dot.junit.opcodes.cmpg_double.d.T_cmpg_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 16
+       move v0, v14
+       move v1, v14
+       move v2, v15
+       move v3, v15
+
+       cmpg-double v0, v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java
new file mode 100644
index 0000000..1ff20a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.cmpg_float.d.T_cmpg_float_1;
+import dot.junit.opcodes.cmpg_float.d.T_cmpg_float_6;
+
+public class Test_cmpg_float extends DxTestCase {
+    /**
+     * @title Arguments = 3.14f, 2.7f
+     */
+    public void testN1() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(1, t.run(3.14f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = -3.14f, 2.7f
+     */
+    public void testN2() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(-1, t.run(-3.14f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = 3.14, 3.14
+     */
+    public void testN3() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(0, t.run(3.14f, 3.14f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this comparison of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_cmpg_float_6 t = new T_cmpg_float_6();
+        try {
+            t.run(123, 3.145f);
+        } catch (Throwable e) {
+        }
+    }      
+    
+    /**
+     * @title Arguments = Float.NaN, Float.MAX_VALUE
+     */
+    public void testB1() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(1, t.run(Float.NaN, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB2() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(0, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Float.NEGATIVE_INFINITY, Float.MIN_VALUE
+     */
+    public void testB3() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(-1, t.run(Float.NEGATIVE_INFINITY, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, Float.MAX_VALUE
+     */
+    public void testB4() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB5() {
+        T_cmpg_float_1 t = new T_cmpg_float_1();
+        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_float.d.T_cmpg_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_float.d.T_cmpg_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_float.d.T_cmpg_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpg_float.d.T_cmpg_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d
new file mode 100644
index 0000000..a32772d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_1.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpg-float v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java
new file mode 100644
index 0000000..9e3eb7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_float.d;
+
+public class T_cmpg_float_1 {
+
+    public int run(float a, float b) {
+        if(a > b)
+            return 1;
+        if(a == b)
+            return 0;
+        return -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d
new file mode 100644
index 0000000..abaed4c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_2.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       const-wide v1, 3.1414
+       cmpg-float v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d
new file mode 100644
index 0000000..f741d1e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_3.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       const-wide v1, 234234
+       cmpg-float v0, v1, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d
new file mode 100644
index 0000000..f40f08e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_4.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpg-float v0, v6, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d
new file mode 100644
index 0000000..46a019a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_5.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpg-float v0, v9, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d
new file mode 100644
index 0000000..1051f14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpg_float_6.java
+.class public dot.junit.opcodes.cmpg_float.d.T_cmpg_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 9
+       cmpg-float v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java
new file mode 100644
index 0000000..8a785ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpg_float.d;
+
+public class T_cmpg_float_6 {
+
+    public int run(int a, float b) {
+        return -2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java
new file mode 100644
index 0000000..9f54c52
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.cmpl_double.d.T_cmpl_double_3;
+import dot.junit.opcodes.cmpl_double.d.T_cmpl_double_1;
+
+public class Test_cmpl_double extends DxTestCase {
+    /**
+     * @title Arguments = 3.14d, 2.7d
+     */
+    public void testN1() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(1, t.run(3.14d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = -3.14d, 2.7d
+     */
+    public void testN2() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(-1, t.run(-3.14d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = 3.14, 3.14
+     */
+    public void testN3() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(0, t.run(3.14d, 3.14d));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this comparison of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_cmpl_double_3 t = new T_cmpl_double_3();
+        try {
+            t.run(123l, 3.145d);
+        } catch (Throwable e) {
+        }
+    }      
+    
+    /**
+     * @title Arguments = Double.NaN, Double.MAX_VALUE
+     */
+    public void testB1() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(-1, t.run(Double.NaN, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB2() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(0, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Double.NEGATIVE_INFINITY, Double.MIN_VALUE
+     */
+    public void testB3() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(-1, t.run(Double.NEGATIVE_INFINITY, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, Double.MAX_VALUE
+     */
+    public void testB4() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(1, t.run(Double.POSITIVE_INFINITY, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB5() {
+        T_cmpl_double_1 t = new T_cmpl_double_1();
+        assertEquals(1, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, float
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_double.d.T_cmpl_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+    * @constraint A24 
+    * @title number of registers
+    */
+    public void testVFE2() {
+       try {
+           Class.forName("dot.junit.opcodes.cmpl_double.d.T_cmpl_double_5");
+           fail("expected a verification exception");
+       } catch (Throwable t) {
+           DxUtil.checkVerifyException(t);
+       }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_double.d.T_cmpl_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_double.d.T_cmpl_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d
new file mode 100644
index 0000000..03a840e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_1.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       cmpl-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java
new file mode 100644
index 0000000..cb1587f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_double.d;
+
+public class T_cmpl_double_1 {
+
+    public int run(double a, double b) {
+        if(a > b)
+            return 1;
+        if(a == b)
+            return 0;
+        return -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d
new file mode 100644
index 0000000..49566ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_2.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       const v14, 3.14
+       cmpl-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d
new file mode 100644
index 0000000..e132fa0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_3.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)I
+.limit regs 16
+
+       cmpl-double v0, v12, v14
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java
new file mode 100644
index 0000000..5f32c2c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_double.d;
+
+public class T_cmpl_double_3 {
+
+    public int run(long a, double b) {
+        return -2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d
new file mode 100644
index 0000000..cf01f55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_4.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       const-wide v12, 12356
+       cmpl-double v0, v12, v11
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d
new file mode 100644
index 0000000..453ee43
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_5.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)I
+.limit regs 16
+
+       cmpl-double v0, v12, v16
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d
new file mode 100644
index 0000000..720ec7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_double_6.java
+.class public dot.junit.opcodes.cmpl_double.d.T_cmpl_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 16
+       move v0, v14
+       move v1, v14
+       move v2, v15
+       move v3, v15
+
+       cmpl-double v0, v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java
new file mode 100644
index 0000000..3ca0b5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.cmpl_float.d.T_cmpl_float_6;
+import dot.junit.opcodes.cmpl_float.d.T_cmpl_float_1;
+
+public class Test_cmpl_float extends DxTestCase {
+    /**
+     * @title Arguments = 3.14f, 2.7f
+     */
+    public void testN1() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(1, t.run(3.14f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = -3.14f, 2.7f
+     */
+    public void testN2() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(-1, t.run(-3.14f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = 3.14, 3.14
+     */
+    public void testN3() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(0, t.run(3.14f, 3.14f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this comparison of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_cmpl_float_6 t = new T_cmpl_float_6();
+        try {
+            t.run(123, 3.145f);
+        } catch (Throwable e) {
+        }
+    }     
+    
+    /**
+     * @title Arguments = Float.NaN, Float.MAX_VALUE
+     */
+    public void testB1() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(-1, t.run(Float.NaN, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = +0, -0
+     */
+    public void testB2() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(0, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Float.NEGATIVE_INFINITY, Float.MIN_VALUE
+     */
+    public void testB3() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(-1, t.run(Float.NEGATIVE_INFINITY, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, Float.MAX_VALUE
+     */
+    public void testB4() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB5() {
+        T_cmpl_float_1 t = new T_cmpl_float_1();
+        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_float.d.T_cmpl_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title types of arguments - long, float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_float.d.T_cmpl_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_float.d.T_cmpl_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.cmpl_float.d.T_cmpl_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d
new file mode 100644
index 0000000..48f14e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_1.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpl-float v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java
new file mode 100644
index 0000000..afd42d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_float.d;
+
+public class T_cmpl_float_1 {
+
+    public int run(float a, float b) {
+        if(a > b)
+            return 1;
+        if(a == b)
+            return 0;
+        return -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d
new file mode 100644
index 0000000..67ed903
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_2.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       const-wide v1, 3.1414
+       cmpl-float v0, v7, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d
new file mode 100644
index 0000000..b43f114
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_3.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       const-wide v1, 234234
+       cmpl-float v0, v1, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d
new file mode 100644
index 0000000..a4aa08e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_4.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpl-float v0, v6, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d
new file mode 100644
index 0000000..d496c11
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_5.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 9
+       cmpl-float v0, v9, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d
new file mode 100644
index 0000000..05a9e62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_cmpl_float_6.java
+.class public dot.junit.opcodes.cmpl_float.d.T_cmpl_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 9
+       cmpl-float v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java
new file mode 100644
index 0000000..e41e14a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.cmpl_float.d;
+
+public class T_cmpl_float_6 {
+
+    public int run(int a, float b) {
+        return -2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/Test_const_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/Test_const_16.java
new file mode 100644
index 0000000..00e6b78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/Test_const_16.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_16.d.T_const_16_1;
+
+public class Test_const_16 extends DxTestCase {
+    
+    /**
+     * @title const/16 v254, -20000
+     */
+    public void testN2() {
+        T_const_16_1 t = new T_const_16_1();
+         int a = -10000;
+         int b = -10000;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_16.d.T_const_16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_16.d.T_const_16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.d
new file mode 100644
index 0000000..6078e06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_16_1.java
+.class public dot.junit.opcodes.const_16.d.T_const_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 255
+
+       const/16 v254, -20000
+       return v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.java
new file mode 100644
index 0000000..3285906
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_16.d;
+
+public class T_const_16_1 {
+
+    public int run() {
+        return -20000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_3.d
new file mode 100644
index 0000000..4e0bfa7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_16_3.java
+.class public dot.junit.opcodes.const_16.d.T_const_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v3, 1234
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_4.d
new file mode 100644
index 0000000..4040879
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_16/d/T_const_16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_16_4.java
+.class public dot.junit.opcodes.const_16.d.T_const_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const/16 v1, 1234
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/Test_const_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/Test_const_4.java
new file mode 100644
index 0000000..d9bb26b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/Test_const_4.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_4;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_4.d.T_const_4_1;
+
+public class Test_const_4 extends DxTestCase {
+    /**
+     * @title const/4 v15, -4
+     */
+    public void testN2() {
+        T_const_4_1 t = new T_const_4_1();
+         int a = -2;
+         int b = -2;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_4.d.T_const_4_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_4.d.T_const_4_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.d
new file mode 100644
index 0000000..77c522e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_4_1.java
+.class public dot.junit.opcodes.const_4.d.T_const_4_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 16
+
+       const/4 v15, -4
+       return v15
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.java
new file mode 100644
index 0000000..a8b8ab3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_4.d;
+
+public class T_const_4_1 {
+
+    public int run() {
+        return -4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_3.d
new file mode 100644
index 0000000..d435f16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_4_3.java
+.class public dot.junit.opcodes.const_4.d.T_const_4_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/4 v3, 1
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_4.d
new file mode 100644
index 0000000..5ca94d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_4/d/T_const_4_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_4_4.java
+.class public dot.junit.opcodes.const_4.d.T_const_4_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const/4 v1, 2
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/TestStubs.java
new file mode 100644
index 0000000..3897d2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/TestStubs.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class;
+
+//used by testE2
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/Test_const_class.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/Test_const_class.java
new file mode 100644
index 0000000..93f5ee4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/Test_const_class.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_class.d.T_const_class_1;
+import dot.junit.opcodes.const_class.d.T_const_class_2;
+import dot.junit.opcodes.const_class.d.T_const_class_6;
+import dot.junit.opcodes.const_class.d.T_const_class_7;
+
+public class Test_const_class extends DxTestCase {
+    /**
+     * @title const-class v254, java/lang/String
+     */
+    public void testN1() {
+        T_const_class_1 t = new T_const_class_1();
+        Class c = t.run();
+        assertEquals(0, c.getCanonicalName().compareTo("java.lang.String"));
+    }
+    
+    /**
+     * @title const-class v254, I
+     */
+    public void testN2() {
+        T_const_class_2 t = new T_const_class_2();
+        Class c = t.run();
+        assertEquals(c.getCanonicalName(), "int");
+    }
+
+    /**
+     * @title Class definition not found
+     */
+    public void testE1() {
+        try {
+            T_const_class_6 t = new T_const_class_6();
+            t.run();
+            fail("expected a verification exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        } catch(VerifyError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @title Class is not accessible
+     */
+    public void testE2() {
+        //@uses dot.junit.opcodes.const_class.TestStubs
+        //@uses dot.junit.opcodes.const_class.d.T_const_class_7
+        try {
+            T_const_class_7 t = new T_const_class_7();
+            t.run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_class.d.T_const_class_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_class.d.T_const_class_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A18 
+     * @title  constant pool index
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.const_class.d.T_const_class_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.d
new file mode 100644
index 0000000..6359d92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_1.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Class;
+.limit regs 255
+
+       const-class v254, java/lang/String
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.java
new file mode 100644
index 0000000..d95f659
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class.d;
+
+public class T_const_class_1 {
+
+    public Class run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.d
new file mode 100644
index 0000000..39bb30e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_2.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Class;
+.limit regs 255
+
+       const-class v254, I
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.java
new file mode 100644
index 0000000..030d3e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class.d;
+
+public class T_const_class_2 {
+
+    public Class run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_3.d
new file mode 100644
index 0000000..50da342
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_3.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-class v3, java/lang/Object
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_4.d
new file mode 100644
index 0000000..6f6b7b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_4.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-class v1, java/lang/Object
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.d
new file mode 100644
index 0000000..24186a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_5.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 255
+
+       const-class v254, java/lang/Object
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh
new file mode 100644
index 0000000..db89eba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh
@@ -0,0 +1,254 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_class/d/T_const_class_5.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_class/d/T_const_class_5.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : ad464cd4
+    D4 4C 46 AD 
+// parsed: offset 12, len 20: signature           : 959c...4307
+    95 9C 6C 40 92 C8 1F 85 87 C2 86 A1 52 39 A6 87 C9 63 43 07 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "L"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/const_class/d/T_const_class_5;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 370 (0x000172) "Ljava/lang/String;"
+    72 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 390 (0x000186) "T_const_class_5.java"
+    86 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 412 (0x00019c) "V"
+    9C 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/const_class/d/T_const_class_5;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/const_class/d/T_const_class_5;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_const_class_5.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.const_class.d.T_const_class_5.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.const_class.d.T_const_class_5.run"
+    // parsed: offset 264, len 2: registers_size: 255
+        FF 00 
+    // parsed: offset 266, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: const-class v254, Ljava/lang/Object; // class@0001
+//@mod            1C FE 01 00 
+            1C FE 01 01 
+        // parsed: offset 284, len 2: |0002: return-object v254
+            11 FE 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 299, len 51: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/const_class/d/T_const_class_5;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 63 6F 6E 73 74 5F 63 6C 61 73 73 2F 64 2F 54 5F 63 6F 6E 73 74 5F 63 6C 61 73 73 5F 35 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 390, len 22: TYPE_STRING_DATA_ITEM [5] "T_const_class_5.java"
+    14 54 5F 63 6F 6E 73 74 5F 63 6C 61 73 73 5F 35 2E 6A 61 76 61 00 
+// parsed: offset 412, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/const_class/d/T_const_class_5;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.d
new file mode 100644
index 0000000..bd893c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_6.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Class;
+.limit regs 255
+
+       const-class v254, java/lang/StringNNNNN
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.java
new file mode 100644
index 0000000..4dd4ad3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class.d;
+
+public class T_const_class_6 {
+
+    public Class run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.d
new file mode 100644
index 0000000..20d9749
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_class_7.java
+.class public dot.junit.opcodes.const_class.d.T_const_class_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Class;
+.limit regs 255
+
+       const-class v254, dot/junit/opcodes/const_class/TestStubs
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.java
new file mode 100644
index 0000000..b67d795
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_class/d/T_const_class_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_class.d;
+
+public class T_const_class_7 {
+
+    public Class run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/Test_const_high16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/Test_const_high16.java
new file mode 100644
index 0000000..68340a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/Test_const_high16.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_high16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_high16.d.T_const_high16_1;
+
+public class Test_const_high16 extends DxTestCase {
+    /**
+     * @title const/high16 v254, 0x12340000
+     */
+    public void testN1() {
+        T_const_high16_1 t = new T_const_high16_1();
+        assertEquals(0x12340000, t.run());
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_high16.d.T_const_high16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_high16.d.T_const_high16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d
new file mode 100644
index 0000000..fcc1c2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_high16_1.java
+.class public dot.junit.opcodes.const_high16.d.T_const_high16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 255
+
+       const/high16 v254, 0x12340000
+       return v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java
new file mode 100644
index 0000000..df8cf3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_high16.d;
+
+public class T_const_high16_1 {
+
+    public int run() {
+        return -20000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d
new file mode 100644
index 0000000..e207c68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_high16_3.java
+.class public dot.junit.opcodes.const_high16.d.T_const_high16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/high16 v3, 0x12340000
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d
new file mode 100644
index 0000000..f8caefa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_high16_4.java
+.class public dot.junit.opcodes.const_high16.d.T_const_high16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const/high16 v1, 0x12340000
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/Test_const_string.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/Test_const_string.java
new file mode 100644
index 0000000..b5c778d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/Test_const_string.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_string;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_string.d.T_const_string_1;
+
+public class Test_const_string extends DxTestCase {
+    /**
+     * @title const-string v254, "android"
+     */
+    public void testN1() {
+        T_const_string_1 t = new T_const_string_1();
+        String s = t.run();
+        assertEquals(s.compareTo("android"), 0);
+        
+        String s2 = t.run();
+        assertTrue(s == s2);
+    }
+
+    /**
+     * @constraint A23
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string.d.T_const_string_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string.d.T_const_string_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A9 
+     * @title  constant pool index
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string.d.T_const_string_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.d
new file mode 100644
index 0000000..11b3770
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_1.java
+.class public dot.junit.opcodes.const_string.d.T_const_string_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 255
+
+       const-string v254, "android"
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.java
new file mode 100644
index 0000000..0bb9508
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_string.d;
+
+public class T_const_string_1 {
+
+    public String run() {
+        return "android";
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_3.d
new file mode 100644
index 0000000..773bd80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_3.java
+.class public dot.junit.opcodes.const_string.d.T_const_string_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-string v3, "abc"
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_4.d
new file mode 100644
index 0000000..d8b8519
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_4.java
+.class public dot.junit.opcodes.const_string.d.T_const_string_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-string v1, "abc"
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.d
new file mode 100644
index 0000000..1ece763
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_5.java
+.class public dot.junit.opcodes.const_string.d.T_const_string_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 255
+
+       const-string v254, "android"
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh
new file mode 100644
index 0000000..96a95b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh
@@ -0,0 +1,258 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_string/d/T_const_string_5.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_string/d/T_const_string_5.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 557d54bb
+    BB 54 7D 55 
+// parsed: offset 12, len 20: signature           : ffa5...7ccb
+    FF A5 C3 77 3F 0D DA AE 41 93 96 A8 0C B7 F6 FB 04 BB 7C CB 
+// parsed: offset 32, len 4: file_size           : 576
+    40 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 452 (0x0001c4)
+    C4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 164 (0x0000a4)
+    A4 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 188 (0x0000bc)
+    BC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 332
+    4C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 244 (0x0000f4)
+    F4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "L"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/const_string/d/T_const_string_5;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 356 (0x000164) "Ljava/lang/Object;"
+    64 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 376 (0x000178) "Ljava/lang/String;"
+    78 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "T_const_string_5.java"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 419 (0x0001a3) "V"
+    A3 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 422 (0x0001a6) "android"
+    A6 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 431 (0x0001af) "run"
+    AF 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/const_string/d/T_const_string_5;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 164, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 176, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 188, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 196, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 8 (0x000008) "run"
+    00 00 00 00 08 00 00 00 
+// parsed: offset 204, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 212, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/const_string/d/T_const_string_5;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_const_string_5.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 436 (0x0001b4)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 B4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.const_string.d.T_const_string_5.<init>"
+    // parsed: offset 244, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 246, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 248, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 250, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 252, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 256, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 260, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 266, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.const_string.d.T_const_string_5.run"
+    // parsed: offset 268, len 2: registers_size: 255
+        FF 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 284, len 4: |0000: const-string v254, "android" // string@0007
+//@mod            1A FE 07 00 
+            1A FE 07 01 
+        // parsed: offset 288, len 2: |0002: return-object v254
+            11 FE 
+    // tries: 
+    // handlers: 
+// parsed: offset 290, len 2: PADDING
+    00 00 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 303, len 53: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/const_string/d/T_const_string_5;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 2F 64 2F 54 5F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 5F 35 3B 00 
+// parsed: offset 356, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 376, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 396, len 23: TYPE_STRING_DATA_ITEM [5] "T_const_string_5.java"
+    15 54 5F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 5F 35 2E 6A 61 76 61 00 
+// parsed: offset 419, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 422, len 9: TYPE_STRING_DATA_ITEM [7] "android"
+    07 61 6E 64 72 6F 69 64 00 
+// parsed: offset 431, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/const_string/d/T_const_string_5;"
+    // parsed: offset 436, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 437, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 438, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 439, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 440, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 441, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 444, len 2: code_off: 244 (0x0000f4)
+                F4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 446, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 447, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 448, len 2: code_off: 268 (0x00010c)
+                8C 02 
+// parsed: offset 450, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 452, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 456, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 468, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 480, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 148 (0x000094)
+        02 00 00 00 04 00 00 00 94 00 00 00 
+    // parsed: offset 492, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 164 (0x0000a4)
+        03 00 00 00 02 00 00 00 A4 00 00 00 
+    // parsed: offset 504, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 188 (0x0000bc)
+        05 00 00 00 03 00 00 00 BC 00 00 00 
+    // parsed: offset 516, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 212 (0x0000d4)
+        06 00 00 00 01 00 00 00 D4 00 00 00 
+    // parsed: offset 528, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 244 (0x0000f4)
+        01 20 00 00 02 00 00 00 F4 00 00 00 
+    // parsed: offset 540, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 292 (0x000124)
+        02 20 00 00 09 00 00 00 24 01 00 00 
+    // parsed: offset 552, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 20 00 00 01 00 00 00 B4 01 00 00 
+    // parsed: offset 564, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 452 (0x0001c4)
+        00 10 00 00 01 00 00 00 C4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java
new file mode 100644
index 0000000..6234730
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_string_jumbo;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_1;
+
+public class Test_const_string_jumbo extends DxTestCase {
+    /**
+     * @title const-string/jumbo v254, "android jumbo"
+     */
+    public void testN1() {
+        T_const_string_jumbo_1 t = new T_const_string_jumbo_1();
+        String s = t.run();
+        assertEquals(0, s.compareTo("android jumbo"));
+        
+        String s2 = t.run();
+        assertTrue(s == s2);
+    }
+
+    /**
+     * @constraint A23
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A9 
+     * @title constant pool index
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d
new file mode 100644
index 0000000..893baf2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_jumbo_1.java
+.class public dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 255
+
+       const-string/jumbo v254, "android jumbo"
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java
new file mode 100644
index 0000000..35b9b28
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_string_jumbo.d;
+
+public class T_const_string_jumbo_1 {
+
+    public String run() {
+        return "android jumbo";
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d
new file mode 100644
index 0000000..c563141
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_jumbo_3.java
+.class public dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-string/jumbo v3, "abc jumbo"
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d
new file mode 100644
index 0000000..c4088d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_jumbo_4.java
+.class public dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-string/jumbo v1, "abc jumbo"
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d
new file mode 100644
index 0000000..649d3ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_string_jumbo_5.java
+.class public dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 255
+
+       const-string v254, "android jumbo"
+       return-object v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh
new file mode 100644
index 0000000..6ffa6a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh
@@ -0,0 +1,258 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 38775db4
+    B4 5D 77 38 
+// parsed: offset 12, len 20: signature           : b102...2cf6
+    B1 02 9F DE 62 D1 2A B1 06 67 17 07 84 AB F4 FF 90 21 2C F6 
+// parsed: offset 32, len 4: file_size           : 600
+    58 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 476 (0x0001dc)
+    DC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 164 (0x0000a4)
+    A4 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 188 (0x0000bc)
+    BC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 356
+    64 01 00 00 
+// parsed: offset 108, len 4: data_off            : 244 (0x0000f4)
+    F4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "L"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 368 (0x000170) "Ljava/lang/Object;"
+    70 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 388 (0x000184) "Ljava/lang/String;"
+    84 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 408 (0x000198) "T_const_string_jumbo_5.java"
+    98 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 437 (0x0001b5) "V"
+    B5 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 440 (0x0001b8) "android jumbo"
+    B8 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 455 (0x0001c7) "run"
+    C7 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 164, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 176, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 188, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 196, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 8 (0x000008) "run"
+    00 00 00 00 08 00 00 00 
+// parsed: offset 204, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 212, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_const_string_jumbo_5.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 460 (0x0001cc)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 CC 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_5.<init>"
+    // parsed: offset 244, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 246, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 248, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 250, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 252, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 256, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 260, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 266, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.const_string_jumbo.d.T_const_string_jumbo_5.run"
+    // parsed: offset 268, len 2: registers_size: 255
+        FF 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 284, len 4: |0000: const-string v254, "android jumbo" // string@0007
+//@mod            1A FE 07 00 
+            1A FE 07 01 
+        // parsed: offset 288, len 2: |0002: return-object v254
+            11 FE 
+    // tries: 
+    // handlers: 
+// parsed: offset 290, len 2: PADDING
+    00 00 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 303, len 65: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5;"
+    3F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 5F 6A 75 6D 62 6F 2F 64 2F 54 5F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 5F 6A 75 6D 62 6F 5F 35 3B 00 
+// parsed: offset 368, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 388, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 408, len 29: TYPE_STRING_DATA_ITEM [5] "T_const_string_jumbo_5.java"
+    1B 54 5F 63 6F 6E 73 74 5F 73 74 72 69 6E 67 5F 6A 75 6D 62 6F 5F 35 2E 6A 61 76 61 00 
+// parsed: offset 437, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 440, len 15: TYPE_STRING_DATA_ITEM [7] "android jumbo"
+    0D 61 6E 64 72 6F 69 64 20 6A 75 6D 62 6F 00 
+// parsed: offset 455, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5;"
+    // parsed: offset 460, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 461, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 462, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 463, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 464, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 465, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 468, len 2: code_off: 244 (0x0000f4)
+                F4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 470, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 471, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 472, len 2: code_off: 268 (0x00010c)
+                8C 02 
+// parsed: offset 474, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 476, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 480, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 492, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 504, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 148 (0x000094)
+        02 00 00 00 04 00 00 00 94 00 00 00 
+    // parsed: offset 516, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 164 (0x0000a4)
+        03 00 00 00 02 00 00 00 A4 00 00 00 
+    // parsed: offset 528, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 188 (0x0000bc)
+        05 00 00 00 03 00 00 00 BC 00 00 00 
+    // parsed: offset 540, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 212 (0x0000d4)
+        06 00 00 00 01 00 00 00 D4 00 00 00 
+    // parsed: offset 552, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 244 (0x0000f4)
+        01 20 00 00 02 00 00 00 F4 00 00 00 
+    // parsed: offset 564, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 292 (0x000124)
+        02 20 00 00 09 00 00 00 24 01 00 00 
+    // parsed: offset 576, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 460 (0x0001cc)
+        00 20 00 00 01 00 00 00 CC 01 00 00 
+    // parsed: offset 588, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 476 (0x0001dc)
+        00 10 00 00 01 00 00 00 DC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/Test_const_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/Test_const_wide.java
new file mode 100644
index 0000000..1ce3caa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/Test_const_wide.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_wide.d.T_const_wide_1;
+import dot.junit.opcodes.const_wide.d.T_const_wide_2;
+
+public class Test_const_wide extends DxTestCase {
+    /**
+     * @title const-wide v1, 1.2345678901232324E51
+     */
+    public void testN1() {
+        T_const_wide_1 t = new T_const_wide_1();
+        double a = 1234567890123232323232232323232323232323232323456788d;
+        double b = 1d;
+        assertEquals(a + b, t.run(), 0d);
+    }
+    
+    /**
+     * @title const-wide v253, 20000000000
+     */
+    public void testN2() {
+        T_const_wide_2 t = new T_const_wide_2();
+         long a = 10000000000l;
+         long b = 10000000000l;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint A24
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide.d.T_const_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide.d.T_const_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d
new file mode 100644
index 0000000..6809530
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_1.java
+.class public dot.junit.opcodes.const_wide.d.T_const_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 3
+
+       const-wide v1, 1.2345678901232324E51
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java
new file mode 100644
index 0000000..b219a93
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide.d;
+
+public class T_const_wide_1 {
+    
+    public double run(){
+        return 1.54d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d
new file mode 100644
index 0000000..b2ddede
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_2.java
+.class public dot.junit.opcodes.const_wide.d.T_const_wide_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 255
+
+       const-wide v253, 20000000000
+       return-wide v253
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java
new file mode 100644
index 0000000..0c9c438
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide.d;
+
+public class T_const_wide_2 {
+
+    public long run() {
+        return 20000000000l;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d
new file mode 100644
index 0000000..1fab9ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_3.java
+.class public dot.junit.opcodes.const_wide.d.T_const_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v3, 1234
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d
new file mode 100644
index 0000000..9493e94
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_4.java
+.class public dot.junit.opcodes.const_wide.d.T_const_wide_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-wide v1, 3456
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java
new file mode 100644
index 0000000..941b00d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_wide_16.d.T_const_wide_16_1;
+
+public class Test_const_wide_16 extends DxTestCase {
+
+    /**
+     * @title const-wide/16 v253, 20000
+     */
+    public void testN1() {
+        T_const_wide_16_1 t = new T_const_wide_16_1();
+         long a = 10000l;
+         long b = 10000l;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint A24
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_16.d.T_const_wide_16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_16.d.T_const_wide_16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d
new file mode 100644
index 0000000..02c4e1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_16_1.java
+.class public dot.junit.opcodes.const_wide_16.d.T_const_wide_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 255
+
+       const-wide/16 v253, 20000
+       return-wide v253
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java
new file mode 100644
index 0000000..708bf83
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_16.d;
+
+public class T_const_wide_16_1 {
+    
+    public long run(){
+        return 0l;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d
new file mode 100644
index 0000000..eebf570
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_16_3.java
+.class public dot.junit.opcodes.const_wide_16.d.T_const_wide_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide/16 v3, 1234
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d
new file mode 100644
index 0000000..c1d79b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_16_4.java
+.class public dot.junit.opcodes.const_wide_16.d.T_const_wide_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-wide/16 v1, 3456
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java
new file mode 100644
index 0000000..0847b3b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_32;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_wide_32.d.T_const_wide_32_1;
+
+public class Test_const_wide_32 extends DxTestCase {
+    /**
+     * @title const-wide/32 v253, 20000000
+     */
+    public void testN1() {
+        T_const_wide_32_1 t = new T_const_wide_32_1();
+         long a = 10000000l;
+         long b = 10000000l;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_32.d.T_const_wide_32_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_32.d.T_const_wide_32_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d
new file mode 100644
index 0000000..1962b17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_32_1.java
+.class public dot.junit.opcodes.const_wide_32.d.T_const_wide_32_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 255
+
+       const-wide/32 v253, 20000000
+       return-wide v253
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java
new file mode 100644
index 0000000..38be11f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_32.d;
+
+public class T_const_wide_32_1 {
+    
+    public long run(){
+        return 0l;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d
new file mode 100644
index 0000000..44821ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_32_3.java
+.class public dot.junit.opcodes.const_wide_32.d.T_const_wide_32_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide/32 v3, 1234
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d
new file mode 100644
index 0000000..afae8dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_32_4.java
+.class public dot.junit.opcodes.const_wide_32.d.T_const_wide_32_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-wide/32 v1, 3456
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java
new file mode 100644
index 0000000..2dd3e32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_high16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_1;
+
+public class Test_const_wide_high16 extends DxTestCase {
+    /**
+     * @title const-wide/high16 v252, 0x1234000000000000
+     */
+    public void testN2() {
+        T_const_wide_high16_1 t = new T_const_wide_high16_1();
+        assertEquals(0x1234000000000000l, t.run());
+    }
+
+    /**
+     * @constraint A24
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11
+     * @title  When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d
new file mode 100644
index 0000000..c051462
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_high16_1.java
+.class public dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 255
+
+       const-wide/high16 v252, 0x1234000000000000
+       return-wide v252
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java
new file mode 100644
index 0000000..8a06f17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.const_wide_high16.d;
+
+public class T_const_wide_high16_1 {
+
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d
new file mode 100644
index 0000000..24a577c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_high16_3.java
+.class public dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide/high16 v3, 0x1234000000000000
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d
new file mode 100644
index 0000000..614e5a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_const_wide_high16_4.java
+.class public dot.junit.opcodes.const_wide_high16.d.T_const_wide_high16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const-wide/high16 v1, 0x1234000000000000
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/Test_div_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/Test_div_double.java
new file mode 100644
index 0000000..5ce7889
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/Test_div_double.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_double.d.T_div_double_1;
+import dot.junit.opcodes.div_double.d.T_div_double_3;
+
+public class Test_div_double extends DxTestCase {
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(0.8598726114649682d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(0d, t.run(0, 3.14d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this division of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_div_double_3 t = new T_div_double_3();
+        try {
+            t.run(3.14d, 12345l);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(0d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(-0d, t.run(0, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(-2.7d, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(1, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_div_double_1 t = new T_div_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.MAX_VALUE, -1E-9f));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double.d.T_div_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double.d.T_div_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double / reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double.d.T_div_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int / int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double.d.T_div_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.d
new file mode 100644
index 0000000..359ec34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_1.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.java
new file mode 100644
index 0000000..734f130
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double.d;
+
+public class T_div_double_1 {
+
+    public double run(double a, double b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_2.d
new file mode 100644
index 0000000..e09176a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       const v10, 3.1415
+       div-double v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.d
new file mode 100644
index 0000000..02d7929
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_3.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DJ)D
+.limit regs 14
+
+       div-double v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.java
new file mode 100644
index 0000000..0cad5bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double.d;
+
+public class T_div_double_3 {
+
+    public double run(double a, long b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_4.d
new file mode 100644
index 0000000..411b01a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_4.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double v0, v9, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_5.d
new file mode 100644
index 0000000..2675538
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_5.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double v0, v10, v14
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_6.d
new file mode 100644
index 0000000..9ef0732
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double/d/T_div_double_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_6.java
+.class public dot.junit.opcodes.div_double.d.T_div_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 14
+       move v0, v12
+       move v1, v12
+       move v2, v13
+       move v3, v13
+       div-double v0, v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java
new file mode 100644
index 0000000..42332e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_1;
+import dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_3;
+
+public class Test_div_double_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(0.8598726114649682d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(0d, t.run(0, 3.14d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this division of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_div_double_2addr_3 t = new T_div_double_2addr_3();
+        try {
+            t.run(3.14d, 12345l);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(0d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(-0d, t.run(0, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(-2.7d, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(1, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_div_double_2addr_1 t = new T_div_double_2addr_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.MAX_VALUE, -1E-9f));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double / reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int / int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d
new file mode 100644
index 0000000..541526e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_1.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double/2addr v10, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java
new file mode 100644
index 0000000..e853239
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double_2addr.d;
+
+public class T_div_double_2addr_1 {
+
+    public double run(double a, double b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d
new file mode 100644
index 0000000..5921ceb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_2.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       const v0, 3.1415
+       div-double/2addr v0, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d
new file mode 100644
index 0000000..840ea8b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_3.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DJ)D
+.limit regs 14
+
+       div-double/2addr v10, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java
new file mode 100644
index 0000000..96d1e60
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_double_2addr.d;
+
+public class T_div_double_2addr_3 {
+
+    public double run(double a, long b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d
new file mode 100644
index 0000000..5cee125
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_4.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double/2addr v9, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d
new file mode 100644
index 0000000..2ef12c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_5.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       div-double/2addr v10, v14
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d
new file mode 100644
index 0000000..05fc08e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_double_2addr_6.java
+.class public dot.junit.opcodes.div_double_2addr.d.T_div_double_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 14
+       move v0, v12
+       move v1, v12
+       move v2, v13
+       move v3, v13
+       div-double/2addr v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/Test_div_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/Test_div_float.java
new file mode 100644
index 0000000..8671505
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/Test_div_float.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_float.d.T_div_float_1;
+import dot.junit.opcodes.div_float.d.T_div_float_5;
+
+public class Test_div_float extends DxTestCase {
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(0.8598726f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(0f, t.run(0, 3.14f));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(-1.162963f, t.run(-3.14f, 2.7f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_div_float_5 t = new T_div_float_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(0f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(-0f, t.run(0, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(-2.7f, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(1, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_div_float_1 t = new T_div_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.MAX_VALUE, -1E-9f));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float.d.T_div_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long / float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float.d.T_div_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float.d.T_div_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float.d.T_div_float_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.d
new file mode 100644
index 0000000..5d59692
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_1.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       div-float v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.java
new file mode 100644
index 0000000..b75e42b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float.d;
+
+public class T_div_float_1 {
+
+    public float run(float a, float b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_2.d
new file mode 100644
index 0000000..4a82c48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       const-wide v0, 3.14
+       div-float v0, v0, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_3.d
new file mode 100644
index 0000000..9a8b28b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_3.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       const-wide v0, 1234
+       div-float v0, v7, v0
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_4.d
new file mode 100644
index 0000000..ed7b149
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_4.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       div-float v0, v5, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.d
new file mode 100644
index 0000000..4602631
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_5.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 8
+       div-float v0, v6, v7
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.java
new file mode 100644
index 0000000..68d16fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float.d;
+
+public class T_div_float_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_6.d
new file mode 100644
index 0000000..4777687
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float/d/T_div_float_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_6.java
+.class public dot.junit.opcodes.div_float.d.T_div_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       div-float v0, v6, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java
new file mode 100644
index 0000000..3fdeb70
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_1;
+import dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_5;
+
+public class Test_div_float_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(0.8598726f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(0f, t.run(0, 3.14f));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(-1.162963f, t.run(-3.14f, 2.7f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_div_float_2addr_5 t = new T_div_float_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(0f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(-0f, t.run(0, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(-2.7f, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(1, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_div_float_2addr_1 t = new T_div_float_2addr_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.MAX_VALUE, -1E-9f));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d
new file mode 100644
index 0000000..93362fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_1.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       div-float/2addr v6, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java
new file mode 100644
index 0000000..bfa9c61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float_2addr.d;
+
+public class T_div_float_2addr_1 {
+
+    public float run(float a, float b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d
new file mode 100644
index 0000000..90ea869
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_2.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       const-wide v0, 3.14
+       div-float/2addr v0, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d
new file mode 100644
index 0000000..f9bddfd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_3.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       const-wide v0, 1234
+       div-float/2addr v7, v0
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d
new file mode 100644
index 0000000..377cda1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_4.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       div-float/2addr v5, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d
new file mode 100644
index 0000000..2f5a998
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_5.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 8
+       div-float/2addr v6, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java
new file mode 100644
index 0000000..fe4a948
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_float_2addr.d;
+
+public class T_div_float_2addr_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d
new file mode 100644
index 0000000..ed354e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_div_float_2addr_6.java
+.class public dot.junit.opcodes.div_float_2addr.d.T_div_float_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+       div-float/2addr v6, v8
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/Test_div_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/Test_div_int.java
new file mode 100644
index 0000000..14614a6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/Test_div_int.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_int.d.T_div_int_1;
+import dot.junit.opcodes.div_int.d.T_div_int_5;
+
+public class Test_div_int extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(2, t.run(8, 4));
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(268435455, t.run(1073741823, 4));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(0, t.run(0, 4));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(-3, t.run(-10, 3));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(-357913941, t.run(1073741824, -3));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(5965, t.run(-17895697, -3000));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_div_int_5 t = new T_div_int_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }  
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_div_int_1 t = new T_div_int_1();
+        // result is MIN_VALUE because overflow occurs in this case
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_div_int_1 t = new T_div_int_1();
+        //fail("why this test causes floating point exception?");
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(0, t.run(1, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_int_1 t = new T_div_int_1();
+        assertEquals(0, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_int_1 t = new T_div_int_1();
+        try {
+            t.run(1, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int.d.T_div_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int.d.T_div_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int.d.T_div_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int.d.T_div_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.d
new file mode 100644
index 0000000..aaaf0a3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_1.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.java
new file mode 100644
index 0000000..b43738d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int.d;
+
+public class T_div_int_1 {
+
+    public int run(int a, int b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_2.d
new file mode 100644
index 0000000..8fb324c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v1, 3.1415
+       div-int v0, v3, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_3.d
new file mode 100644
index 0000000..446cc2c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_3.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v1, 31415
+       div-int v0, v1, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_4.d
new file mode 100644
index 0000000..c476934
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_4.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int v0, v1, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.d
new file mode 100644
index 0000000..ad4c79c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_5.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+
+       div-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.java
new file mode 100644
index 0000000..21ba362
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int.d;
+
+public class T_div_int_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_6.d
new file mode 100644
index 0000000..6da816d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int/d/T_div_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_6.java
+.class public dot.junit.opcodes.div_int.d.T_div_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java
new file mode 100644
index 0000000..276c840
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_1;
+import dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_5;
+
+public class Test_div_int_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(2, t.run(8, 4));
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(268435455, t.run(1073741823, 4));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(0, t.run(0, 4));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(-3, t.run(-10, 3));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(-357913941, t.run(1073741824, -3));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(5965, t.run(-17895697, -3000));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_div_int_2addr_5 t = new T_div_int_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = Integer.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        // result is MIN_VALUE because overflow occurs in this case
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(0, t.run(1, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        assertEquals(0, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_int_2addr_1 t = new T_div_int_2addr_1();
+        try {
+            t.run(1, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d
new file mode 100644
index 0000000..00b88e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_1.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java
new file mode 100644
index 0000000..67464ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_2addr.d;
+
+public class T_div_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a/b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d
new file mode 100644
index 0000000..10e15fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_2.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 3.1415
+       div-int/2addr v3, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d
new file mode 100644
index 0000000..483865e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_3.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 323231415
+       div-int/2addr v3, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d
new file mode 100644
index 0000000..fbda213
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_4.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int/2addr v1, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d
new file mode 100644
index 0000000..2ee42a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_5.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+
+       div-int/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java
new file mode 100644
index 0000000..f206f22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_2addr.d;
+
+public class T_div_int_2addr_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d
new file mode 100644
index 0000000..7742df6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_2addr_6.java
+.class public dot.junit.opcodes.div_int_2addr.d.T_div_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       div-int/2addr v2, v4
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java
new file mode 100644
index 0000000..02cc14a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_1;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_10;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_11;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_12;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_13;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_17;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_2;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_3;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_4;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_5;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_6;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_7;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_8;
+import dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_9;
+
+
+public class Test_div_int_lit16 extends DxTestCase {
+    /**
+     * @title Arguments = 8 / 4
+     */
+    public void testN1() {
+        T_div_int_lit16_1 t = new T_div_int_lit16_1();
+        assertEquals(2, t.run());
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_int_lit16_2 t = new T_div_int_lit16_2();
+        assertEquals(268435455, t.run());
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_int_lit16_3 t = new T_div_int_lit16_3();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_int_lit16_4 t = new T_div_int_lit16_4();
+        assertEquals(-3, t.run());
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_int_lit16_5 t = new T_div_int_lit16_5();
+        assertEquals(-357913941, t.run());
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_int_lit16_6 t = new T_div_int_lit16_6();
+        assertEquals(5965, t.run());
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_div_int_lit16_17 t = new T_div_int_lit16_17();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / -1
+     */
+    public void testB1() {
+        T_div_int_lit16_7 t = new T_div_int_lit16_7();
+        // result is MIN_VALUE because overflow occurs in this case
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / 1
+     */
+    public void testB2() {
+        T_div_int_lit16_8 t = new T_div_int_lit16_8();
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE / 1
+     */
+    public void testB3() {
+        T_div_int_lit16_9 t = new T_div_int_lit16_9();
+        assertEquals(Integer.MAX_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / Short.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_int_lit16_10 t = new T_div_int_lit16_10();
+        assertEquals(-65538, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 / Short.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_int_lit16_11 t = new T_div_int_lit16_11();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 / Short.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_int_lit16_12 t = new T_div_int_lit16_12();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_int_lit16_13 t = new T_div_int_lit16_13();
+        try {
+            t.run();
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d
new file mode 100644
index 0000000..6b57fb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_1.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 8
+       div-int/lit16 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java
new file mode 100644
index 0000000..3a1df06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_1 {
+
+    public int run() {
+        return 8 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d
new file mode 100644
index 0000000..d665855
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_10.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit16 v0, v2, 32767
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java
new file mode 100644
index 0000000..46925a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_10 {
+
+    public int run() {
+        return Integer.MIN_VALUE / Short.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d
new file mode 100644
index 0000000..9f6cd95
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_11.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit16 v0, v2, 32767
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java
new file mode 100644
index 0000000..b0b3e69
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_11 {
+
+    public int run() {
+        return 1 / Short.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d
new file mode 100644
index 0000000..e99957a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_12.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit16 v0, v2, -32768
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java
new file mode 100644
index 0000000..be1428e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_12 {
+
+    public int run() {
+        return 1 / Short.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d
new file mode 100644
index 0000000..4115385
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_13.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit16 v0, v2, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java
new file mode 100644
index 0000000..bbbab37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_13 {
+
+    public int run() {
+        return 1 / 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d
new file mode 100644
index 0000000..3731d36
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_14.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide v1, 31415
+       div-int/lit16 v1, v1, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d
new file mode 100644
index 0000000..27fba6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_15.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide v1, 3.1415
+       div-int/lit16 v1, v1, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d
new file mode 100644
index 0000000..6caadaf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_16.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       div-int/lit16 v1, v3, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d
new file mode 100644
index 0000000..b60a81d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_17.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+
+       div-int/lit16 v0, v3, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java
new file mode 100644
index 0000000..71cee9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_17 {
+
+    public int run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d
new file mode 100644
index 0000000..6215666
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_18.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       div-int/lit16 v0, v4, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d
new file mode 100644
index 0000000..dd4e3f6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_2.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1073741823
+       div-int/lit16 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java
new file mode 100644
index 0000000..10a63dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_2 {
+
+    public int run() {
+        return 1073741823 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d
new file mode 100644
index 0000000..b3b4713
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_3.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 0
+       div-int/lit16 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java
new file mode 100644
index 0000000..ad3d6d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_3 {
+
+    public int run() {
+        return 0 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d
new file mode 100644
index 0000000..e131fc4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_4.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -10
+       div-int/lit16 v0, v2, 3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java
new file mode 100644
index 0000000..cbf7f0b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_4 {
+
+    public int run() {
+        return -10 / 3;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d
new file mode 100644
index 0000000..b61badf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_5.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1073741824
+       div-int/lit16 v0, v2, -3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java
new file mode 100644
index 0000000..3a1d497
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_5 {
+
+    public int run() {
+        return 1073741824 / -3;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d
new file mode 100644
index 0000000..c97edff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_6.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -17895697
+       div-int/lit16 v0, v2, -3000
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java
new file mode 100644
index 0000000..7875953
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_6 {
+
+    public int run() {
+        return -17895697 / -3000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d
new file mode 100644
index 0000000..66cc917
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_7.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit16 v0, v2, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java
new file mode 100644
index 0000000..3fa111c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_7 {
+
+    public int run() {
+        return Integer.MIN_VALUE / -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d
new file mode 100644
index 0000000..6f2fd00
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_8.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit16 v0, v2, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java
new file mode 100644
index 0000000..3389e8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_8 {
+
+    public int run() {
+        return Integer.MIN_VALUE / 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d
new file mode 100644
index 0000000..68f757e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit16_9.java
+.class public dot.junit.opcodes.div_int_lit16.d.T_div_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 2147483647
+       div-int/lit16 v0, v2, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java
new file mode 100644
index 0000000..bf34419
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit16.d;
+
+public class T_div_int_lit16_9 {
+
+    public int run() {
+        return Integer.MAX_VALUE / 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java
new file mode 100644
index 0000000..e2c4057
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_17;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_1;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_10;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_11;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_12;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_13;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_2;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_3;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_4;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_5;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_6;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_7;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_8;
+import dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_9;
+
+public class Test_div_int_lit8 extends DxTestCase {
+     /**
+     * @title Arguments = 8 / 4
+     */
+    public void testN1() {
+        T_div_int_lit8_1 t = new T_div_int_lit8_1();
+        assertEquals(2, t.run());
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_int_lit8_2 t = new T_div_int_lit8_2();
+        assertEquals(268435455, t.run());
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_int_lit8_3 t = new T_div_int_lit8_3();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_int_lit8_4 t = new T_div_int_lit8_4();
+        assertEquals(-3, t.run());
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_int_lit8_5 t = new T_div_int_lit8_5();
+        assertEquals(-357913941, t.run());
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_int_lit8_6 t = new T_div_int_lit8_6();
+        assertEquals(596523, t.run());
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this division of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_div_int_lit8_17 t = new T_div_int_lit8_17();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / -1
+     */
+    public void testB1() {
+        T_div_int_lit8_7 t = new T_div_int_lit8_7();
+        // result is MIN_VALUE because overflow occurs in this case
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / 1
+     */
+    public void testB2() {
+        T_div_int_lit8_8 t = new T_div_int_lit8_8();
+        assertEquals(Integer.MIN_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE / 1
+     */
+    public void testB3() {
+        T_div_int_lit8_9 t = new T_div_int_lit8_9();
+        assertEquals(Integer.MAX_VALUE, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE / Byte.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_int_lit8_10 t = new T_div_int_lit8_10();
+        assertEquals(-16909320, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 / Byte.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_int_lit8_11 t = new T_div_int_lit8_11();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 / Byte.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_int_lit8_12 t = new T_div_int_lit8_12();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_int_lit8_13 t = new T_div_int_lit8_13();
+        try {
+            t.run();
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int / double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long / int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d
new file mode 100644
index 0000000..4c6a389
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_1.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 8
+       div-int/lit8 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java
new file mode 100644
index 0000000..04177b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_1 {
+
+    public int run() {
+        return 8 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d
new file mode 100644
index 0000000..25c0e77
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_10.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit8 v0, v2, 127
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java
new file mode 100644
index 0000000..8c71346
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_10 {
+
+    public int run() {
+        return Integer.MIN_VALUE / Byte.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d
new file mode 100644
index 0000000..9522183
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_11.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit8 v0, v2, 127
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java
new file mode 100644
index 0000000..9e2d788
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_11 {
+
+    public int run() {
+        return 1 / Byte.MAX_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d
new file mode 100644
index 0000000..cd72c52
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_12.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit8 v0, v2, -128
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java
new file mode 100644
index 0000000..9468233
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_12 {
+
+    public int run() {
+        return 1 / Byte.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d
new file mode 100644
index 0000000..1465ebc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_13.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1
+       div-int/lit8 v0, v2, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java
new file mode 100644
index 0000000..2e8cbcb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_13 {
+
+    public int run() {
+        return 1 / 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d
new file mode 100644
index 0000000..492ccbc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_14.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide v1, 31415
+       div-int/lit8 v1, v1, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d
new file mode 100644
index 0000000..88d70a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_15.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide v1, 3.1415
+       div-int/lit8 v1, v1, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d
new file mode 100644
index 0000000..f93542a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_16.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       div-int/lit8 v1, v3, 1
+       const v0, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d
new file mode 100644
index 0000000..b4169d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_17.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+
+       div-int/lit8 v0, v3, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java
new file mode 100644
index 0000000..329612d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_17 {
+
+    public int run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d
new file mode 100644
index 0000000..10859c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_18.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       div-int/lit8 v0, v4, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d
new file mode 100644
index 0000000..96145c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_2.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1073741823
+       div-int/lit8 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java
new file mode 100644
index 0000000..496ac7d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_2 {
+
+    public int run() {
+        return 1073741823 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d
new file mode 100644
index 0000000..a93a8b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_3.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 0
+       div-int/lit8 v0, v2, 4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java
new file mode 100644
index 0000000..29829ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_3 {
+
+    public int run() {
+        return 0 / 4;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d
new file mode 100644
index 0000000..458cfb1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_4.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -10
+       div-int/lit8 v0, v2, 3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java
new file mode 100644
index 0000000..f92aed1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_4 {
+
+    public int run() {
+        return -10 / 3;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d
new file mode 100644
index 0000000..3901a7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_5.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 1073741824
+       div-int/lit8 v0, v2, -3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java
new file mode 100644
index 0000000..bb60183
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_5 {
+
+    public int run() {
+        return 1073741824 / -3;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d
new file mode 100644
index 0000000..35f9c63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_6.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -17895697
+       div-int/lit8 v0, v2, -30
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java
new file mode 100644
index 0000000..d071b33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_6 {
+
+    public int run() {
+        return -17895697 / -30;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d
new file mode 100644
index 0000000..0d4f492
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_7.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit8 v0, v2, -1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java
new file mode 100644
index 0000000..7f7180a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_7 {
+
+    public int run() {
+        return Integer.MIN_VALUE / -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d
new file mode 100644
index 0000000..ee80b01
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_8.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, -2147483648
+       div-int/lit8 v0, v2, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java
new file mode 100644
index 0000000..5563dd8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_8 {
+
+    public int run() {
+        return Integer.MIN_VALUE / 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d
new file mode 100644
index 0000000..466cf0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_int_lit8_9.java
+.class public dot.junit.opcodes.div_int_lit8.d.T_div_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const v2, 2147483647
+       div-int/lit8 v0, v2, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java
new file mode 100644
index 0000000..5c62b29
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_int_lit8.d;
+
+public class T_div_int_lit8_9 {
+
+    public int run() {
+        return Integer.MAX_VALUE / 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/Test_div_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/Test_div_long.java
new file mode 100644
index 0000000..b0e1d31
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/Test_div_long.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_long.d.T_div_long_1;
+import dot.junit.opcodes.div_long.d.T_div_long_2;
+
+
+public class Test_div_long extends DxTestCase {
+    /**
+     * @title Arguments = 100000000000l, 40000000000l
+     */
+    public void testN1() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(2l, t.run(100000000000l, 40000000000l));
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(8l, t.run(98765432123456l, 12345678912345l));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(0l, t.run(0l, 98765432123456l));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(-8, t.run(-98765432123456l, 12345678912345l));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(-8, t.run(98765432123456l, -12345678912345l));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(80l, t.run(-98765432123456l, -1234567891234l));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this division of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_div_long_2 t = new T_div_long_2();
+        try {
+            t.run(1234l, 3.1415d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(-1, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Long.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(0, t.run(1, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_long_1 t = new T_div_long_1();
+        assertEquals(0, t.run(1, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_long_1 t = new T_div_long_1();
+        try {
+            t.run(12345678912345l, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long.d.T_div_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int / long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long.d.T_div_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float / long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long.d.T_div_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long.d.T_div_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.d
new file mode 100644
index 0000000..fdf2445
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_1.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.java
new file mode 100644
index 0000000..783d7ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_1.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long.d;
+
+
+public class T_div_long_1 {
+
+    public long run(long a, long b) {
+        return a/b;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.d
new file mode 100644
index 0000000..e72e2a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       div-long v0, v10, v12
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.java
new file mode 100644
index 0000000..e6b3456
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long.d;
+
+
+public class T_div_long_2 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_3.d
new file mode 100644
index 0000000..6a43649
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_3.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v10, 1234
+       div-long v0, v10, v12
+       return-wide v12
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_4.d
new file mode 100644
index 0000000..409b45a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_4.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v10, 3.14
+       div-long v0, v10, v12
+       return-wide v12
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_5.d
new file mode 100644
index 0000000..648b110
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_5.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long v0, v9, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_6.d
new file mode 100644
index 0000000..b2a6d0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long/d/T_div_long_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_6.java
+.class public dot.junit.opcodes.div_long.d.T_div_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long v0, v10, v14
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java
new file mode 100644
index 0000000..5ba3dad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_1;
+import dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_2;
+
+public class Test_div_long_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 100000000000l, 40000000000l
+     */
+    public void testN1() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(2l, t.run(100000000000l, 40000000000l));
+    }
+
+    /**
+     * @title Rounding
+     */
+    public void testN2() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(8l, t.run(98765432123456l, 12345678912345l));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(0l, t.run(0l, 98765432123456l));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(-8, t.run(-98765432123456l, 12345678912345l));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(-8, t.run(98765432123456l, -12345678912345l));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(80l, t.run(-98765432123456l, -1234567891234l));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this division of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_div_long_2addr_2 t = new T_div_long_2addr_2();
+        try {
+            t.run(1234l, 3.1415d);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(-1, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Long.MAX_VALUE
+     */
+    public void testB5() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(0, t.run(1, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        assertEquals(0, t.run(1, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_div_long_2addr_1 t = new T_div_long_2addr_1();
+        try {
+            t.run(12345678912345l, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int / long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float / long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference / long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d
new file mode 100644
index 0000000..0ae9ff3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_1.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long/2addr v10, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java
new file mode 100644
index 0000000..031cac2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long_2addr.d;
+
+
+public class T_div_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a/b;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d
new file mode 100644
index 0000000..f01fcf4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_2.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       div-long/2addr v10, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java
new file mode 100644
index 0000000..674284e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.div_long_2addr.d;
+
+
+public class T_div_long_2addr_2 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d
new file mode 100644
index 0000000..09e48c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_3.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v0, 1234
+       div-long/2addr v0, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d
new file mode 100644
index 0000000..6d91919
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_4.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       const v0, 3.14
+       div-long/2addr v0, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d
new file mode 100644
index 0000000..ed7fdfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_5.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long/2addr v9, v12
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d
new file mode 100644
index 0000000..83e2b30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_div_long_2addr_6.java
+.class public dot.junit.opcodes.div_long_2addr.d.T_div_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       div-long/2addr v10, v14
+       return-wide v10
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java
new file mode 100644
index 0000000..780ffef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.double_to_float.d.T_double_to_float_1;
+import dot.junit.opcodes.double_to_float.d.T_double_to_float_3;
+
+public class Test_double_to_float extends DxTestCase {
+     /**
+     * @title Argument = 2.71
+     */
+    public void testN1() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(2.71f, t.run(2.71d));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(1f, t.run(1d));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(-1f, t.run(-1d));
+    }
+    
+    /**
+     * @title Type of argument - long. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of long to float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_double_to_float_3 t = new T_double_to_float_3();
+        try {
+            t.run(12345l);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Double.MAX_VALUE
+     */
+    public void testB1() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Double.MIN_VALUE
+     */
+    public void testB2() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(0f, t.run(Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Argument = -0
+     */
+    public void testB3() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(-0f, t.run(-0d));
+    }
+
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertTrue(Float.isNaN(t.run(Double.NaN)));
+    }
+
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertTrue(Float.isInfinite(t.run(Double.POSITIVE_INFINITY)));
+    }
+
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertTrue(Float.isInfinite(t.run(Double.NEGATIVE_INFINITY)));
+    }
+
+
+    /**
+     * @title Argument = -Double.MIN_VALUE
+     */
+    public void testB7() {
+        T_double_to_float_1 t = new T_double_to_float_1();
+        assertEquals(-0f, t.run(-4.9E-324d));
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_float.d.T_double_to_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_float.d.T_double_to_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_float.d.T_double_to_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_float.d.T_double_to_float_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d
new file mode 100644
index 0000000..24b332f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_1.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 8
+
+       double-to-float v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java
new file mode 100644
index 0000000..c2cf023
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_float.d;
+
+public class T_double_to_float_1 {
+
+    public float run(double a) {
+        return (float)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d
new file mode 100644
index 0000000..402cfac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_2.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 8
+
+       const v6, 3.14
+       double-to-float v0, v6
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d
new file mode 100644
index 0000000..1cbf6f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_3.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 8
+
+       double-to-float v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java
new file mode 100644
index 0000000..f4be401
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_float.d;
+
+public class T_double_to_float_3 {
+
+    public float run(long a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d
new file mode 100644
index 0000000..135e7ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_4.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 8
+
+       double-to-float v0, v5
+       
+       const v3, 3.14
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d
new file mode 100644
index 0000000..80adf03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_5.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 8
+
+       double-to-float v0, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d
new file mode 100644
index 0000000..9c65fb8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_float_6.java
+.class public dot.junit.opcodes.double_to_float.d.T_double_to_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)V
+.limit regs 8
+
+       move v0, v7
+       move v1, v7    
+       double-to-float v0, v0
+       
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java
new file mode 100644
index 0000000..86a3cdc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.double_to_int.d.T_double_to_int_1;
+import dot.junit.opcodes.double_to_int.d.T_double_to_int_3;
+
+
+public class Test_double_to_int extends DxTestCase {
+    /**
+     * @title Argument = 2.9999999d
+     */
+    public void testN1() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(2, t.run(2.9999999d));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(1, t.run(1d));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(-1, t.run(-1d));
+    }
+
+    /**
+     * @title Type of argument - long. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of long to int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_double_to_int_3 t = new T_double_to_int_3();
+        try {
+            t.run(12345l);
+        } catch (Throwable e) {
+        }
+    }    
+    
+    /**
+     * @title Argument = -0
+     */
+    public void testB1() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(0, t.run(-0d));
+    }
+
+    /**
+     * @title Argument = Double.MAX_VALUE
+     */
+    public void testB2() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Double.MIN_VALUE
+     */
+    public void testB3() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(0, t.run(Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(0, t.run(Double.NaN));
+    }
+
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_double_to_int_1 t = new T_double_to_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Double.NEGATIVE_INFINITY));
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_int.d.T_double_to_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_int.d.T_double_to_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_int.d.T_double_to_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_int.d.T_double_to_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d
new file mode 100644
index 0000000..82f2467
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_1.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       double-to-int v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java
new file mode 100644
index 0000000..208a2bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_int.d;
+
+public class T_double_to_int_1 {
+
+    public int run(double a) {
+        return (int)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d
new file mode 100644
index 0000000..7e3a98b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_2.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       const v6, 3.14
+       double-to-int v0, v6
+       const v1, 123
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d
new file mode 100644
index 0000000..07f855a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_3.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       double-to-int v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java
new file mode 100644
index 0000000..03e205b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_int.d;
+
+public class T_double_to_int_3 {
+
+    public int run(long a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d
new file mode 100644
index 0000000..1f62ffb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_4.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       double-to-int v0, v5
+       
+       const v3, 123
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d
new file mode 100644
index 0000000..e4477d8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_5.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       double-to-int v0, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d
new file mode 100644
index 0000000..ecbe761
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_int_6.java
+.class public dot.junit.opcodes.double_to_int.d.T_double_to_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)V
+.limit regs 8
+
+       move v0, v7
+       move v1, v7    
+       double-to-int v0, v0
+       
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java
new file mode 100644
index 0000000..089558e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.double_to_long.d.T_double_to_long_1;
+import dot.junit.opcodes.double_to_long.d.T_double_to_long_3;
+
+public class Test_double_to_long extends DxTestCase {
+    /**
+     * @title Argument = 2.9999999
+     */
+    public void testN1() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(2l, t.run(2.9999999d));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(1l, t.run(1d));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(-1l, t.run(-1d));
+    }
+    
+    /**
+     * @title Type of argument - long. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of long to long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_double_to_long_3 t = new T_double_to_long_3();
+        try {
+            t.run(12345l);
+        } catch (Throwable e) {
+        }
+    }    
+
+    /**
+     * @title Argument = Double.MAX_VALUE
+     */
+    public void testB1() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(Long.MAX_VALUE, t.run(Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Double.MIN_VALUE
+     */
+    public void testB2() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(0, t.run(Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Argument = -0
+     */
+    public void testB3() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(0l, t.run(-0));
+    }
+
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(0l, t.run(Double.NaN));
+    }
+
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(Long.MAX_VALUE, t.run(Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_double_to_long_1 t = new T_double_to_long_1();
+        assertEquals(Long.MIN_VALUE, t.run(Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - float
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_long.d.T_double_to_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_long.d.T_double_to_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_long.d.T_double_to_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.double_to_long.d.T_double_to_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d
new file mode 100644
index 0000000..677d352
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_1.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 8
+
+       double-to-long v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java
new file mode 100644
index 0000000..11469d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_long.d;
+
+public class T_double_to_long_1 {
+
+    public long run(double a) {
+        return (long)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d
new file mode 100644
index 0000000..54740b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_2.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 8
+
+       const v6, 3.14
+       double-to-long v0, v6
+       const-wide v2, 123
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d
new file mode 100644
index 0000000..1f2293d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_3.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 8
+
+       const-wide v6, 32380293
+       double-to-long v0, v6
+       const-wide v2, 123
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java
new file mode 100644
index 0000000..043a2ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.double_to_long.d;
+
+public class T_double_to_long_3 {
+
+    public long run(long a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d
new file mode 100644
index 0000000..df716b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_4.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 8
+
+       double-to-long v0, v5
+       
+       const-wide v2, 123
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d
new file mode 100644
index 0000000..8b11c73
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_5.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 8
+
+       double-to-long v0, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d
new file mode 100644
index 0000000..6aeb8fd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_double_to_long_6.java
+.class public dot.junit.opcodes.double_to_long.d.T_double_to_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)V
+.limit regs 8
+
+       move v0, v7
+       move v1, v7    
+       double-to-long v0, v0
+       
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java
new file mode 100644
index 0000000..5bac3cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.fill_array_data;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.fill_array_data.d.T_fill_array_data_1;
+import dot.junit.opcodes.fill_array_data.d.T_fill_array_data_2;
+
+public class Test_fill_array_data extends DxTestCase {
+    /**
+     * @title array of ints
+     */
+    public void testN1() {
+        int arr[] = new int[5];
+        T_fill_array_data_1 t = new T_fill_array_data_1();
+        t.run(arr);
+        for(int i = 0; i < 5; i++)
+            assertEquals(i + 1, arr[i]);
+     }
+    
+    /**
+     * @title array of doubles
+     */
+    public void testN2() {
+        double arr[] = new double[5];
+        T_fill_array_data_2 t = new T_fill_array_data_2();
+        t.run(arr);
+        for(int i = 0; i < 5; i++)
+            assertEquals((double)(i + 1), arr[i]);
+     }
+
+    /**
+     * @title If there are less elements in the table than the array provides space for, 
+     * the remaining array elements stay untouched.  
+     */
+    public void testN3() {
+        int arr[] = new int[10];
+        T_fill_array_data_1 t = new T_fill_array_data_1();
+        t.run(arr);
+        for(int i = 0; i < 5; i++)
+            assertEquals(i + 1, arr[i]);
+        for(int i = 5; i < 10; i++)
+            assertEquals(0, arr[i]);
+     }
+    
+    /**
+     * @title expected NullPointerException  
+     */
+    public void testE1() {
+        T_fill_array_data_1 t = new T_fill_array_data_1();
+        try {
+            t.run(null);
+        } catch(NullPointerException npe) {
+            // expected
+        }
+     }
+    
+    /**
+     * @title expected ArrayIndexOutOfBoundsException  
+     */
+    public void testE2() {
+        int arr[] = new int[2];
+        T_fill_array_data_1 t = new T_fill_array_data_1();
+       try {
+            t.run(arr);
+        } catch(ArrayIndexOutOfBoundsException e) {
+            // expected
+           }
+     }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - reference (not array)
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title array of Objects
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title array type and data size shall be consistent
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title offset to table shall be inside method
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title the size and the list must be consistent. 
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * @constraint B22
+     * @title packed-switch-data pseudo-instructions must not be reachable by control flow 
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title table has wrong ident code
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.fill_array_data.d.T_fill_array_data_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d
new file mode 100644
index 0000000..1c97601
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_1.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java
new file mode 100644
index 0000000..c2a43a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.fill_array_data.d;
+
+public class T_fill_array_data_1 {
+    public void run(int[] arr) {
+        return;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d
new file mode 100644
index 0000000..b462d1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_11.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh
new file mode 100644
index 0000000..bed70ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh
@@ -0,0 +1,264 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 59eb4a7d
+    7D 4A EB 59 
+// parsed: offset 12, len 20: signature           : 083f...2af8
+    08 3F 75 AF 24 45 09 F6 52 52 56 37 0A 56 D4 2A 88 76 2A F8 
+// parsed: offset 32, len 4: file_size           : 604
+    5C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 364
+    6C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 322 (0x000142) "<init>"
+    42 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 330 (0x00014a) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_11;"
+    4A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 390 (0x000186) "Ljava/lang/Object;"
+    86 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 410 (0x00019a) "T_fill_array_data_11.java"
+    9A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 437 (0x0001b5) "V"
+    B5 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 440 (0x0001b8) "VL"
+    B8 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 444 (0x0001bc) "[I"
+    BC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 448 (0x0001c0) "run"
+    C0 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_11;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "[I"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "VL"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 316 (0x00013c)
+    05 00 00 00 02 00 00 00 3C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_fill_array_data_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 453 (0x0001c5)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 C5 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_11.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_11.run"
+    // parsed: offset 264, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 18
+        12 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: fill-array-data v9, 00000004 //  +0x00000004
+            26 09 04 00 00 00 
+        // parsed: offset 286, len 2: |0003: return-void
+            0E 00 
+        // parsed: offset 288, len 28: |0004: array-data (14 units)
+//@mod            00 03 04 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 
+            00 03 04 00 06 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 316, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 320, len 2: type_item [0] type_idx: 3
+        03 00 
+// parsed: offset 322, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 330, len 60: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_11;"
+    3A 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 2F 64 2F 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 31 31 3B 00 
+// parsed: offset 390, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 410, len 27: TYPE_STRING_DATA_ITEM [3] "T_fill_array_data_11.java"
+    19 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 437, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 440, len 4: TYPE_STRING_DATA_ITEM [5] "VL"
+    02 56 4C 00 
+// parsed: offset 444, len 4: TYPE_STRING_DATA_ITEM [6] "[I"
+    02 5B 49 00 
+// parsed: offset 448, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_11;"
+    // parsed: offset 453, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 454, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 455, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 456, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 457, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 458, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 461, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 463, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 464, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 465, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 467, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 468, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 316 (0x00013c)
+        01 10 00 00 01 00 00 00 3C 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 322 (0x000142)
+        02 20 00 00 08 00 00 00 42 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 453 (0x0001c5)
+        00 20 00 00 01 00 00 00 C5 01 00 00 
+    // parsed: offset 592, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d
new file mode 100644
index 0000000..c3ce952
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_12.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    goto Label0
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    return-void
+Label0:    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d
new file mode 100644
index 0000000..0066d29
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_13.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh
new file mode 100644
index 0000000..0d2fc68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh
@@ -0,0 +1,264 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : b2054cd3
+    D3 4C 05 B2 
+// parsed: offset 12, len 20: signature           : 1649...5e25
+    16 49 CA 77 41 DC DC A0 6E 2C E0 E8 CE 58 95 B0 0B 40 5E 25 
+// parsed: offset 32, len 4: file_size           : 604
+    5C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 364
+    6C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 322 (0x000142) "<init>"
+    42 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 330 (0x00014a) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_13;"
+    4A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 390 (0x000186) "Ljava/lang/Object;"
+    86 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 410 (0x00019a) "T_fill_array_data_13.java"
+    9A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 437 (0x0001b5) "V"
+    B5 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 440 (0x0001b8) "VL"
+    B8 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 444 (0x0001bc) "[I"
+    BC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 448 (0x0001c0) "run"
+    C0 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_13;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "[I"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "VL"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 316 (0x00013c)
+    05 00 00 00 02 00 00 00 3C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_13;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_fill_array_data_13.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 453 (0x0001c5)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 C5 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_13.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_13.run"
+    // parsed: offset 264, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 18
+        12 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: fill-array-data v9, 00000004 //  +0x00000004
+            26 09 04 00 00 00 
+        // parsed: offset 286, len 2: |0003: return-void
+            0E 00 
+        // parsed: offset 288, len 28: |0004: array-data (14 units)
+//@mod            00 03 04 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 
+            00 05 04 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 316, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 320, len 2: type_item [0] type_idx: 3
+        03 00 
+// parsed: offset 322, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 330, len 60: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_13;"
+    3A 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 2F 64 2F 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 31 33 3B 00 
+// parsed: offset 390, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 410, len 27: TYPE_STRING_DATA_ITEM [3] "T_fill_array_data_13.java"
+    19 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 31 33 2E 6A 61 76 61 00 
+// parsed: offset 437, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 440, len 4: TYPE_STRING_DATA_ITEM [5] "VL"
+    02 56 4C 00 
+// parsed: offset 444, len 4: TYPE_STRING_DATA_ITEM [6] "[I"
+    02 5B 49 00 
+// parsed: offset 448, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_13;"
+    // parsed: offset 453, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 454, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 455, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 456, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 457, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 458, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 461, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 463, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 464, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 465, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 467, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 468, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 316 (0x00013c)
+        01 10 00 00 01 00 00 00 3C 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 322 (0x000142)
+        02 20 00 00 08 00 00 00 42 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 453 (0x0001c5)
+        00 20 00 00 01 00 00 00 C5 01 00 00 
+    // parsed: offset 592, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d
new file mode 100644
index 0000000..6167ef7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_2.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([D)V
+.limit regs 10
+
+    fill-array-data v9 D
+        1.0
+        2.0
+        3.0
+        4.0
+        5.0
+    fill-array-data-end
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java
new file mode 100644
index 0000000..7c56ef0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.fill_array_data.d;
+
+public class T_fill_array_data_2 {
+    public void run(double[] arr) {
+        return;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d
new file mode 100644
index 0000000..e6ecd1e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_3.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v10 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d
new file mode 100644
index 0000000..221ef8b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_4.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D[I)V
+.limit regs 10
+    
+    fill-array-data v7 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d
new file mode 100644
index 0000000..cc98351
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_5.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J[I)V
+.limit regs 10
+    
+    fill-array-data v7 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d
new file mode 100644
index 0000000..61990a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_6.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v8 I
+        0
+        0
+        0
+        0
+        0
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d
new file mode 100644
index 0000000..8ba5155
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_7.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([Ljava/lang/Object;)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        0
+        0
+        0
+        0
+        0
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d
new file mode 100644
index 0000000..e90eb86
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_8.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([D)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d
new file mode 100644
index 0000000..0a5e008
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_fill_array_data_9.java
+.class public dot.junit.opcodes.fill_array_data.d.T_fill_array_data_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run([I)V
+.limit regs 10
+    
+    fill-array-data v9 I
+        1
+        2
+        3
+        4
+        5
+    fill-array-data-end
+    
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh
new file mode 100644
index 0000000..22cb9c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh
@@ -0,0 +1,264 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 29604be4
+    E4 4B 60 29 
+// parsed: offset 12, len 20: signature           : 38a2...97b7
+    38 A2 2B 55 35 C5 4B 31 51 6E 60 02 2B 76 F6 FC FF 7A 97 B7 
+// parsed: offset 32, len 4: file_size           : 604
+    5C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 364
+    6C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 322 (0x000142) "<init>"
+    42 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 330 (0x00014a) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_9;"
+    4A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 389 (0x000185) "Ljava/lang/Object;"
+    85 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 409 (0x000199) "T_fill_array_data_9.java"
+    99 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 435 (0x0001b3) "V"
+    B3 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 438 (0x0001b6) "VL"
+    B6 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 442 (0x0001ba) "[I"
+    BA 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 446 (0x0001be) "run"
+    BE 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_9;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "[I"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "VL"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 316 (0x00013c)
+    05 00 00 00 02 00 00 00 3C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_fill_array_data_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 451 (0x0001c3)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 C3 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_9.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.fill_array_data.d.T_fill_array_data_9.run"
+    // parsed: offset 264, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 18
+        12 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: fill-array-data v9, 00000004 //  +0x00000004
+//@mod            26 09 04 00 00 00 
+            26 09 04 01 00 00 
+        // parsed: offset 286, len 2: |0003: return-void
+            0E 00 
+        // parsed: offset 288, len 28: |0004: array-data (14 units)
+            00 03 04 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 316, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 320, len 2: type_item [0] type_idx: 3
+        03 00 
+// parsed: offset 322, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 330, len 59: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_9;"
+    39 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 2F 64 2F 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 39 3B 00 
+// parsed: offset 389, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 409, len 26: TYPE_STRING_DATA_ITEM [3] "T_fill_array_data_9.java"
+    18 54 5F 66 69 6C 6C 5F 61 72 72 61 79 5F 64 61 74 61 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 435, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 438, len 4: TYPE_STRING_DATA_ITEM [5] "VL"
+    02 56 4C 00 
+// parsed: offset 442, len 4: TYPE_STRING_DATA_ITEM [6] "[I"
+    02 5B 49 00 
+// parsed: offset 446, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/fill_array_data/d/T_fill_array_data_9;"
+    // parsed: offset 451, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 452, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 453, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 454, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 455, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 456, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 459, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 461, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 462, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 463, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 465, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 468, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 316 (0x00013c)
+        01 10 00 00 01 00 00 00 3C 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 322 (0x000142)
+        02 20 00 00 08 00 00 00 42 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 451 (0x0001c3)
+        00 20 00 00 01 00 00 00 C3 01 00 00 
+    // parsed: offset 592, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/TestStubs.java
new file mode 100644
index 0000000..344f5c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/TestStubs.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2009 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.
+ */
+
+package dot.junit.opcodes.filled_new_array;
+
+// used by T_filled_new_array_11
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java
new file mode 100644
index 0000000..b17c29b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.filled_new_array.d.T_filled_new_array_1;
+import dot.junit.opcodes.filled_new_array.d.T_filled_new_array_10;
+import dot.junit.opcodes.filled_new_array.d.T_filled_new_array_11;
+import dot.junit.opcodes.filled_new_array.d.T_filled_new_array_2;
+
+public class Test_filled_new_array extends DxTestCase {
+    /**
+     * @title array of ints
+     */
+    public void testN1() {
+        T_filled_new_array_1 t = new T_filled_new_array_1();
+        int[] arr = t.run(1, 2, 3, 4, 5);
+        assertNotNull(arr);
+        assertEquals(5, arr.length);
+        for(int i = 0; i < 5; i++)
+            assertEquals(i + 1, arr[i]);
+     }
+
+    /**
+     * @title array of objects
+     */
+    public void testN2() {
+        T_filled_new_array_2 t = new T_filled_new_array_2();
+        String s = "android";
+        Object[] arr = t.run(t, s);
+        assertNotNull(arr);
+        assertEquals(2, arr.length);
+        assertEquals(t, arr[0]);
+        assertEquals(s, arr[1]);
+    }
+
+    /**
+     * @constraint A17
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+         try {
+             Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_3");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+ 
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to pass obj ref instead of int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to pass long instead of int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to create non-array type
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title invalid arg count
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title attempt to instantiate String[] and fill it with reference to assignment-incompatible class
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array.d.T_filled_new_array_9");
+            fail("expected a verification exception"); 
+        } catch(Throwable t) { 
+            DxUtil.checkVerifyException(t);    
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title attempt to instantiate array of non-existent class
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.filled_new_array.d.T_filled_new_array_10
+        try {
+            T_filled_new_array_10 T = new T_filled_new_array_10();
+            T.run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch(NoClassDefFoundError t) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title attempt to instantiate array of inaccessible class
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.filled_new_array.d.T_filled_new_array_11
+        //@uses dot.junit.opcodes.filled_new_array.TestStubs
+        try {
+            T_filled_new_array_11 T = new T_filled_new_array_11();
+            T.run();
+            fail("expected a IllegalAccessError exception");
+        } catch(IllegalAccessError t) {
+            // expected
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d
new file mode 100644
index 0000000..0c195eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_1.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java
new file mode 100644
index 0000000..05cd56f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array.d;
+
+public class T_filled_new_array_1 {
+    public int[] run(int a, int b, int c, int d, int e) {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d
new file mode 100644
index 0000000..ccfc7d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_10.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 10
+    const v9, 0
+    filled-new-array {v9}, [Ljava/lang/StringNNNNN;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java
new file mode 100644
index 0000000..4caf263
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.filled_new_array.d;
+
+public class T_filled_new_array_10 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d
new file mode 100644
index 0000000..dca1ca3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_11.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 10
+    const v9, 0
+    filled-new-array {v9}, [Ldot/junit/opcodes/filled_new_array/TestStubs;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java
new file mode 100644
index 0000000..f25d58f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.filled_new_array.d;
+
+public class T_filled_new_array_11 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d
new file mode 100644
index 0000000..532158e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_2.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
+.limit regs 10
+    filled-new-array {v8, v9}, [Ljava/lang/Object;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java
new file mode 100644
index 0000000..0edab9b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array.d;
+
+public class T_filled_new_array_2 {
+    public Object[] run(Object a, Object b) {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d
new file mode 100644
index 0000000..69d1f79
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_3.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh
new file mode 100644
index 0000000..deace06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh
@@ -0,0 +1,280 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 5ca65099
+    99 50 A6 5C 
+// parsed: offset 12, len 20: signature           : 05d9...c8d3
+    05 D9 B4 47 7C 61 39 F5 99 31 79 2A DE 6F 88 65 3C 8D C8 D3 
+// parsed: offset 32, len 4: file_size           : 604
+    5C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 356
+    64 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "LIIIII"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 333 (0x00014d) "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_3;"
+    4D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 394 (0x00018a) "Ljava/lang/Object;"
+    8A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 414 (0x00019e) "T_filled_new_array_3.java"
+    9E 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 441 (0x0001b9) "V"
+    B9 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 444 (0x0001bc) "[I"
+    BC 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 448 (0x0001c0) "run"
+    C0 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_3;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "[I"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "LIIIII"
+//     return_type_idx: 4 (0x000004) "[I"
+//     parameters_off: 300 (0x00012c)
+    02 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_filled_new_array_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 453 (0x0001c5)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 C5 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array.d.T_filled_new_array_3.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array.d.T_filled_new_array_3.run"
+    // parsed: offset 272, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 274, len 2: ins_size: 6
+        06 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 288, len 6: |0000: filled-new-array {v5, v6, v7, v8, v9}, [I // class@0004
+//@mod            24 59 04 00 65 87 
+            24 59 04 01 65 87 
+        // parsed: offset 294, len 2: |0003: move-result-object v0
+            0C 00 
+        // parsed: offset 296, len 2: |0004: return-object v0
+            11 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 298, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 5
+        05 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+    // parsed: offset 308, len 2: type_item [2] type_idx: 0
+        00 00 
+    // parsed: offset 310, len 2: type_item [3] type_idx: 0
+        00 00 
+    // parsed: offset 312, len 2: type_item [4] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 8: TYPE_STRING_DATA_ITEM [2] "LIIIII"
+    06 4C 49 49 49 49 49 00 
+// parsed: offset 333, len 61: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_3;"
+    3B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 2F 64 2F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 33 3B 00 
+// parsed: offset 394, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 414, len 27: TYPE_STRING_DATA_ITEM [5] "T_filled_new_array_3.java"
+    19 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 441, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 444, len 4: TYPE_STRING_DATA_ITEM [7] "[I"
+    02 5B 49 00 
+// parsed: offset 448, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_3;"
+    // parsed: offset 453, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 454, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 455, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 456, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 457, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 458, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 461, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 463, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 464, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 465, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 467, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 468, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 453 (0x0001c5)
+        00 20 00 00 01 00 00 00 C5 01 00 00 
+    // parsed: offset 592, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d
new file mode 100644
index 0000000..ac6b1b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_4.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v10}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d
new file mode 100644
index 0000000..c2702a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_5.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v4}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d
new file mode 100644
index 0000000..6be462d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_6.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIIJ)V
+.limit regs 11
+    filled-new-array {v5, v6, v7, v8, v9}, [I
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d
new file mode 100644
index 0000000..129a800
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_7.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v9}, I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d
new file mode 100644
index 0000000..951e06a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_8.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 10
+
+       invoke-direct {v9}, java/lang/Object/<init>()V
+       
+       const v5, 0
+       const v6, 0
+       const v7, 0
+       const v8, 0
+       const v9, 0
+       filled-new-array {v5, v6, v7, v8, v9}, [I
+       move-result-object v0
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array {v5, v6, v7, v8, v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh
new file mode 100644
index 0000000..343d149
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh
@@ -0,0 +1,297 @@
+// Processing 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dex'...
+// Opened 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 5bac58f0
+    F0 58 AC 5B 
+// parsed: offset 12, len 20: signature           : d1b9...67e0
+    D1 B9 FB 64 E5 F3 AB 93 DC 90 83 01 BD F0 6C A0 7E B2 67 E0 
+// parsed: offset 32, len 4: file_size           : 644
+    84 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 508 (0x0001fc)
+    FC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 396
+    8C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 354 (0x000162) "<init>"
+    62 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 362 (0x00016a) "I"
+    6A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 365 (0x00016d) "LIIIII"
+    6D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 373 (0x000175) "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_8;"
+    75 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 434 (0x0001b2) "Ljava/lang/Object;"
+    B2 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 454 (0x0001c6) "T_filled_new_array_8.java"
+    C6 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 481 (0x0001e1) "V"
+    E1 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 484 (0x0001e4) "[I"
+    E4 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 488 (0x0001e8) "run"
+    E8 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_8;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "[I"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "LIIIII"
+//     return_type_idx: 4 (0x000004) "[I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 04 00 00 00 54 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_filled_new_array_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 493 (0x0001ed)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 ED 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array.d.T_filled_new_array_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 23
+        17 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v9}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 09 00 
+        // parsed: offset 270, len 6: |0003: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 276, len 6: |0006: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 282, len 6: |0009: const v7, #float 0.000000 // #0x00000000 int
+            14 07 00 00 00 00 
+        // parsed: offset 288, len 6: |000c: const v8, #float 0.000000 // #0x00000000 int
+            14 08 00 00 00 00 
+        // parsed: offset 294, len 6: |000f: const v9, #float 0.000000 // #0x00000000 int
+            14 09 00 00 00 00 
+        // parsed: offset 300, len 6: |0012: filled-new-array {v5, v6, v7, v8, v9}, [I // class@0004
+//@mod            24 59 04 00 65 87 
+            24 F9 04 00 65 87 
+        // parsed: offset 306, len 2: |0015: move-result-object v0
+            0C 00 
+        // parsed: offset 308, len 2: |0016: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 310, len 2: PADDING
+    00 00 
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array.d.T_filled_new_array_8.run"
+    // parsed: offset 312, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 314, len 2: ins_size: 6
+        06 00 
+    // parsed: offset 316, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 318, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 320, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 324, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 328, len 6: |0000: filled-new-array {v5, v6, v7, v8, v9}, [I // class@0004
+//@mod            24 59 04 00 65 87 
+            24 F9 04 00 65 87 
+        // parsed: offset 334, len 2: |0003: move-result-object v0
+            0C 00 
+        // parsed: offset 336, len 2: |0004: return-object v0
+            11 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 338, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 5
+        05 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 346, len 2: type_item [1] type_idx: 0
+        00 00 
+    // parsed: offset 348, len 2: type_item [2] type_idx: 0
+        00 00 
+    // parsed: offset 350, len 2: type_item [3] type_idx: 0
+        00 00 
+    // parsed: offset 352, len 2: type_item [4] type_idx: 0
+        00 00 
+// parsed: offset 354, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 362, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 365, len 8: TYPE_STRING_DATA_ITEM [2] "LIIIII"
+    06 4C 49 49 49 49 49 00 
+// parsed: offset 373, len 61: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_8;"
+    3B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 2F 64 2F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 38 3B 00 
+// parsed: offset 434, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 454, len 27: TYPE_STRING_DATA_ITEM [5] "T_filled_new_array_8.java"
+    19 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 481, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 484, len 4: TYPE_STRING_DATA_ITEM [7] "[I"
+    02 5B 49 00 
+// parsed: offset 488, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/filled_new_array/d/T_filled_new_array_8;"
+    // parsed: offset 493, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 494, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 495, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 496, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 497, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 498, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 501, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 503, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 504, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 505, len 2: code_off: 312 (0x000138)
+                B8 02 
+// parsed: offset 507, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 508, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 512, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 524, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 536, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 548, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 560, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 572, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 584, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 596, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 608, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 354 (0x000162)
+        02 20 00 00 09 00 00 00 62 01 00 00 
+    // parsed: offset 620, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 493 (0x0001ed)
+        00 20 00 00 01 00 00 00 ED 01 00 00 
+    // parsed: offset 632, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 508 (0x0001fc)
+        00 10 00 00 01 00 00 00 FC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d
new file mode 100644
index 0000000..c7ba0ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_9.java
+.class public dot.junit.opcodes.filled_new_array.d.T_filled_new_array_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run(Ljava/lang/Object;)[Ljava/lang/Object;
+.limit regs 10
+    filled-new-array {v9}, [Ljava/lang/String;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java
new file mode 100644
index 0000000..46cac1a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array.d;
+
+public class T_filled_new_array_9 {
+    public Object[] run(Object a) {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java
new file mode 100644
index 0000000..47b87e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2009 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range;
+
+// used by T_filled_new_array_range_11
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java
new file mode 100644
index 0000000..84b1379
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_1;
+import dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_10;
+import dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_11;
+import dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_2;
+
+public class Test_filled_new_array_range extends DxTestCase {
+    /**
+     * @title array of ints
+     */
+    public void testN1() {
+        T_filled_new_array_range_1 t = new T_filled_new_array_range_1();
+        int[] arr = t.run(1, 2, 3, 4, 5);
+        assertNotNull(arr);
+        assertEquals(5, arr.length);
+        for(int i = 0; i < 5; i++)
+            assertEquals(i + 1, arr[i]);
+     }
+
+    /**
+     * @title array of objects
+     */
+    public void testN2() {
+        T_filled_new_array_range_2 t = new T_filled_new_array_range_2();
+        String s = "android";
+        Object[] arr = t.run(t, s);
+        assertNotNull(arr);
+        assertEquals(2, arr.length);
+        assertEquals(t, arr[0]);
+        assertEquals(s, arr[1]);
+    }
+
+    /**
+     * @constraint A18
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to pass obj ref instead of int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to pass long instead of int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title try to create non-array type
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title invalid arg count
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title attempt to instantiate String[] and fill it with reference to assignment-incompatible class
+     */
+    public void testVFE7() {
+        try {
+        	Class.forName("dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_9");
+        	fail("expected a verification exception"); 
+        } catch(Throwable t) { 
+        	DxUtil.checkVerifyException(t);	
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title attempt to instantiate array of non-existent class
+     */
+    public void testVFE8() {
+        T_filled_new_array_range_10 t = new T_filled_new_array_range_10();
+        try {
+            t.run();
+            fail("expected NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title attempt to instantiate array of inaccessible class
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_11
+        //@uses dot.junit.opcodes.filled_new_array_range.TestStubs
+        T_filled_new_array_range_11 t = new T_filled_new_array_range_11();
+        try {
+            t.run();
+            fail("expected IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d
new file mode 100644
index 0000000..503c12a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_1.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v5..v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java
new file mode 100644
index 0000000..6e69a23
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range.d;
+
+public class T_filled_new_array_range_1 {
+    public int[] run(int a, int b, int c, int d, int e) {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d
new file mode 100644
index 0000000..50a34b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_range_10.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 10
+    const v9, 0
+    filled-new-array/range {v9}, [Ljava/lang/StringNNNNN;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java
new file mode 100644
index 0000000..57075bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range.d;
+
+public class T_filled_new_array_range_10 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d
new file mode 100644
index 0000000..e3a21e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_range_11.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 10
+    const v9, 0
+    filled-new-array/range {v9}, [Ldot/junit/opcodes/filled_new_array_range/TestStubs;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java
new file mode 100644
index 0000000..f4ca611
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range.d;
+
+public class T_filled_new_array_range_11 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d
new file mode 100644
index 0000000..2b2ef15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_2.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object;
+.limit regs 10
+    filled-new-array/range {v8..v9}, [Ljava/lang/Object;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java
new file mode 100644
index 0000000..51d1d32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range.d;
+
+public class T_filled_new_array_range_2 {
+    public Object[] run(Object a, Object b) {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d
new file mode 100644
index 0000000..f8c25f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_3.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v5..v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh
new file mode 100644
index 0000000..1a620e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh
@@ -0,0 +1,280 @@
+// Processing 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dex'...
+// Opened 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a199569d
+    9D 56 99 A1 
+// parsed: offset 12, len 20: signature           : 62a6...ef00
+    62 A6 E9 6F 30 02 D1 5F BB C2 AB 25 06 22 11 D4 FF 0B EF 00 
+// parsed: offset 32, len 4: file_size           : 624
+    70 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 488 (0x0001e8)
+    E8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 376
+    78 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "LIIIII"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 333 (0x00014d) "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3;"
+    4D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 406 (0x000196) "Ljava/lang/Object;"
+    96 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 426 (0x0001aa) "T_filled_new_array_range_3.java"
+    AA 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 459 (0x0001cb) "V"
+    CB 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 462 (0x0001ce) "[I"
+    CE 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 466 (0x0001d2) "run"
+    D2 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "[I"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "LIIIII"
+//     return_type_idx: 4 (0x000004) "[I"
+//     parameters_off: 300 (0x00012c)
+    02 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_filled_new_array_range_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 471 (0x0001d7)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D7 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_3.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_3.run"
+    // parsed: offset 272, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 274, len 2: ins_size: 6
+        06 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 288, len 6: |0000: filled-new-array/range {v5..v9}, [I // class@0004
+//@mod            25 05 04 00 05 00 
+            25 05 04 01 05 00 
+        // parsed: offset 294, len 2: |0003: move-result-object v0
+            0C 00 
+        // parsed: offset 296, len 2: |0004: return-object v0
+            11 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 298, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 5
+        05 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+    // parsed: offset 308, len 2: type_item [2] type_idx: 0
+        00 00 
+    // parsed: offset 310, len 2: type_item [3] type_idx: 0
+        00 00 
+    // parsed: offset 312, len 2: type_item [4] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 8: TYPE_STRING_DATA_ITEM [2] "LIIIII"
+    06 4C 49 49 49 49 49 00 
+// parsed: offset 333, len 73: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3;"
+    47 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 2F 64 2F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 5F 33 3B 00 
+// parsed: offset 406, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 426, len 33: TYPE_STRING_DATA_ITEM [5] "T_filled_new_array_range_3.java"
+    1F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 459, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 462, len 4: TYPE_STRING_DATA_ITEM [7] "[I"
+    02 5B 49 00 
+// parsed: offset 466, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3;"
+    // parsed: offset 471, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 472, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 473, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 474, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 475, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 476, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 479, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 481, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 482, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 483, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 485, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 488, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 492, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 504, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 516, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 528, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 540, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 552, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 564, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 576, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 588, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 600, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 471 (0x0001d7)
+        00 20 00 00 01 00 00 00 D7 01 00 00 
+    // parsed: offset 612, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 488 (0x0001e8)
+        00 10 00 00 01 00 00 00 E8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d
new file mode 100644
index 0000000..ab3d24e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_4.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v5..v10}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d
new file mode 100644
index 0000000..6781fa1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_5.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v4..v8}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d
new file mode 100644
index 0000000..33233b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_6.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIIJ)V
+.limit regs 11
+    filled-new-array/range {v5..v9}, [I
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d
new file mode 100644
index 0000000..f60043a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_7.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v5..v9}, I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d
new file mode 100644
index 0000000..7a93faf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_filled_new_array_range_8.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IIIII)[I
+.limit regs 10
+    filled-new-array/range {v5..v9}, [I
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh
new file mode 100644
index 0000000..c2696b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh
@@ -0,0 +1,280 @@
+// Processing 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dex'...
+// Opened 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 8d4c570b
+    0B 57 4C 8D 
+// parsed: offset 12, len 20: signature           : 0ab5...07fe
+    0A B5 95 25 DA 23 40 C1 99 88 9F D1 05 88 E3 24 5C 7C 07 FE 
+// parsed: offset 32, len 4: file_size           : 624
+    70 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 488 (0x0001e8)
+    E8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 376
+    78 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "LIIIII"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 333 (0x00014d) "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8;"
+    4D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 406 (0x000196) "Ljava/lang/Object;"
+    96 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 426 (0x0001aa) "T_filled_new_array_range_8.java"
+    AA 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 459 (0x0001cb) "V"
+    CB 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 462 (0x0001ce) "[I"
+    CE 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 466 (0x0001d2) "run"
+    D2 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "[I"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "LIIIII"
+//     return_type_idx: 4 (0x000004) "[I"
+//     parameters_off: 300 (0x00012c)
+    02 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_filled_new_array_range_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 471 (0x0001d7)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D7 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_8.run"
+    // parsed: offset 272, len 2: registers_size: 10
+        0A 00 
+    // parsed: offset 274, len 2: ins_size: 6
+        06 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 288, len 6: |0000: filled-new-array/range {v5..v9}, [I // class@0004
+//@mod            25 05 04 00 05 00 
+            25 FF 04 00 05 00 
+        // parsed: offset 294, len 2: |0003: move-result-object v0
+            0C 00 
+        // parsed: offset 296, len 2: |0004: return-object v0
+            11 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 298, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 5
+        05 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+    // parsed: offset 308, len 2: type_item [2] type_idx: 0
+        00 00 
+    // parsed: offset 310, len 2: type_item [3] type_idx: 0
+        00 00 
+    // parsed: offset 312, len 2: type_item [4] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 8: TYPE_STRING_DATA_ITEM [2] "LIIIII"
+    06 4C 49 49 49 49 49 00 
+// parsed: offset 333, len 73: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8;"
+    47 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 2F 64 2F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 5F 38 3B 00 
+// parsed: offset 406, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 426, len 33: TYPE_STRING_DATA_ITEM [5] "T_filled_new_array_range_8.java"
+    1F 54 5F 66 69 6C 6C 65 64 5F 6E 65 77 5F 61 72 72 61 79 5F 72 61 6E 67 65 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 459, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 462, len 4: TYPE_STRING_DATA_ITEM [7] "[I"
+    02 5B 49 00 
+// parsed: offset 466, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8;"
+    // parsed: offset 471, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 472, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 473, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 474, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 475, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 476, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 479, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 481, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 482, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 483, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 485, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 488, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 492, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 504, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 516, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 528, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 540, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 552, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 564, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 576, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 588, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 600, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 471 (0x0001d7)
+        00 20 00 00 01 00 00 00 D7 01 00 00 
+    // parsed: offset 612, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 488 (0x0001e8)
+        00 10 00 00 01 00 00 00 E8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d
new file mode 100644
index 0000000..4218cbe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2009 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.
+
+.source T_filled_new_array_range_9.java
+.class public dot.junit.opcodes.filled_new_array_range.d.T_filled_new_array_range_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    return-void
+.end method
+
+.method public run(Ljava/lang/Object;)[Ljava/lang/Object;
+.limit regs 10
+    filled-new-array/range {v9}, [Ljava/lang/String;
+    move-result-object v0
+    return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java
new file mode 100644
index 0000000..42ceba8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.filled_new_array_range.d;
+
+public class T_filled_new_array_range_9 {
+    public void run() {
+        return;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java
new file mode 100644
index 0000000..93b6df7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.float_to_double.d.T_float_to_double_1;
+import dot.junit.opcodes.float_to_double.d.T_float_to_double_7;
+
+public class Test_float_to_double extends DxTestCase {
+     /**
+     * @title Argument = 0.5
+     */
+    public void testN1() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertEquals(0.5d, t.run(0.5f), 0d);
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertEquals(1d, t.run(1), 0d);
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertEquals(-1d, t.run(-1), 0d);
+    }
+    
+    /**
+     * @title Type of argument - int. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of int to double makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_float_to_double_7 t = new T_float_to_double_7();
+        try {
+            t.run(1);
+        } catch (Throwable e) {
+        }
+    }  
+
+    /**
+     * @title Argument = Float.MAX_VALUE
+     */
+    public void testB1() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        double r = 0x1.fffffeP+127d;
+        assertEquals(r, t.run(Float.MAX_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = Float.MIN_VALUE
+     */
+    public void testB2() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        double r = 0x0.000002P-126d;
+        assertEquals(r, t.run(Float.MIN_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = -0
+     */
+    public void testB3() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertEquals(-0d, t.run(-0), 0d);
+    }
+
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertTrue(Double.isNaN(t.run(Float.NaN)));
+    }
+
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertTrue(Double.isInfinite(t.run(Float.POSITIVE_INFINITY)));
+    }
+
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_float_to_double_1 t = new T_float_to_double_1();
+        assertTrue(Double.isInfinite(t.run(Float.NEGATIVE_INFINITY)));
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_double.d.T_float_to_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_double.d.T_float_to_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_double.d.T_float_to_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_double.d.T_float_to_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_double.d.T_float_to_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d
new file mode 100644
index 0000000..0854de3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_1.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       float-to-double v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java
new file mode 100644
index 0000000..c14f8aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_double.d;
+
+public class T_float_to_double_1 {
+
+    public double run(float a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d
new file mode 100644
index 0000000..c37c547
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_2.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       const-wide v2, 3.14    
+       float-to-double v0, v2
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d
new file mode 100644
index 0000000..59217ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_3.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       const-wide v2, 1223
+       float-to-double v0, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d
new file mode 100644
index 0000000..32f2b0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_4.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 1
+
+       const v0, 3.14
+       float-to-double v0, v0
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d
new file mode 100644
index 0000000..77c3dc3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_5.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       float-to-double v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d
new file mode 100644
index 0000000..eac86d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_6.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       float-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d
new file mode 100644
index 0000000..71f3c83
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_double_7.java
+.class public dot.junit.opcodes.float_to_double.d.T_float_to_double_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 6
+
+       float-to-double v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java
new file mode 100644
index 0000000..9018914
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_double.d;
+
+public class T_float_to_double_7 {
+
+    public double run(int a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java
new file mode 100644
index 0000000..27caeaa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.float_to_int.d.T_float_to_int_1;
+import dot.junit.opcodes.float_to_int.d.T_float_to_int_5;
+
+public class Test_float_to_int extends DxTestCase {
+
+    /**
+     * @title Argument = 2.999999f
+     */
+    public void testN1() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(2, t.run(2.999999f));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(1, t.run(1f));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(-1, t.run(-1f));
+    }
+
+    /**
+     * @title Type of argument - int. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of int to int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_float_to_int_5 t = new T_float_to_int_5();
+        try {
+            t.run(1);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Argument = -0f
+     */
+    public void testB1() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(0, t.run(-0f));
+    }
+
+    /**
+     * @title Argument = Float.MAX_VALUE
+     */
+    public void testB2() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Float.MIN_VALUE
+     */
+    public void testB3() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(0, t.run(Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(0, t.run(Float.NaN));
+    }
+
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_float_to_int_1 t = new T_float_to_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Float.NEGATIVE_INFINITY));
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_int.d.T_float_to_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_int.d.T_float_to_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_int.d.T_float_to_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_int.d.T_float_to_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d
new file mode 100644
index 0000000..35f2eef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_1.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       float-to-int v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java
new file mode 100644
index 0000000..b07cb68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_int.d;
+
+public class T_float_to_int_1 {
+
+    public int run(float a) {
+        return (int)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d
new file mode 100644
index 0000000..61a8c4f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_2.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       const-wide v1, 3.14
+       float-to-int v0, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d
new file mode 100644
index 0000000..0401ffd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_3.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       const-wide v1, 1234
+       float-to-int v0, v1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d
new file mode 100644
index 0000000..94fb137
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_4.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       float-to-int v0, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d
new file mode 100644
index 0000000..697a193
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_5.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       float-to-int v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java
new file mode 100644
index 0000000..794d0d9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_int.d;
+
+public class T_float_to_int_5 {
+
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d
new file mode 100644
index 0000000..6fa95c5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_int_6.java
+.class public dot.junit.opcodes.float_to_int.d.T_float_to_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       float-to-int v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java
new file mode 100644
index 0000000..97e2325
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.float_to_long.d.T_float_to_long_1;
+import dot.junit.opcodes.float_to_long.d.T_float_to_long_7;
+
+public class Test_float_to_long extends DxTestCase {
+    /**
+     * @title Argument = 2.999999f
+     */
+    public void testN1() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(2l, t.run(2.999999f));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+         T_float_to_long_1 t = new T_float_to_long_1();
+         assertEquals(1l, t.run(1));
+    }
+    
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+         T_float_to_long_1 t = new T_float_to_long_1();
+         assertEquals(-1l, t.run(-1));
+    }
+
+    /**
+     * @title Type of argument - int. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of int to long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_float_to_long_7 t = new T_float_to_long_7();
+        try {
+            t.run(1);
+        } catch (Throwable e) {
+        }
+    } 
+    
+    /**
+     * @title Argument = Float.MAX_VALUE
+     */
+    public void testB1() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(Long.MAX_VALUE, t.run(Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Float.MIN_VALUE
+     */
+    public void testB2() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(0, t.run(Float.MIN_VALUE));
+    }
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(0l, t.run(0));
+    }
+    
+    /**
+     * @title Argument = NaN
+     */
+    public void testB4() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(0l, t.run(Float.NaN));
+    }
+    
+    /**
+     * @title Argument = POSITIVE_INFINITY
+     */
+    public void testB5() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(Long.MAX_VALUE, t.run(Float.POSITIVE_INFINITY));
+    }
+    
+    /**
+     * @title Argument = NEGATIVE_INFINITY
+     */
+    public void testB6() {
+        T_float_to_long_1 t = new T_float_to_long_1();
+        assertEquals(Long.MIN_VALUE, t.run(Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @constraint B1 
+     * @title number of arguments
+     */
+    public void testVFE1() {
+        try
+        {
+            Class.forName("dxc.junit.opcodes.float_to_long.jm.T_float_to_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try
+        {
+            Class.forName("dot.junit.opcodes.float_to_long.d.T_float_to_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try
+        {
+            Class.forName("dot.junit.opcodes.float_to_long.d.T_float_to_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try
+        {
+            Class.forName("dot.junit.opcodes.float_to_long.d.T_float_to_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE5() {
+        try
+        {
+            Class.forName("dot.junit.opcodes.float_to_long.d.T_float_to_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.float_to_long.d.T_float_to_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d
new file mode 100644
index 0000000..a4a5c24
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_1.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       float-to-long v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java
new file mode 100644
index 0000000..667a37b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_long.d;
+
+public class T_float_to_long_1 {
+
+    public long run(float a) {
+        return (long)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d
new file mode 100644
index 0000000..ea3525a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_2.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       const-wide v2, 3.14    
+       float-to-long v0, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d
new file mode 100644
index 0000000..1fde1d8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_3.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       const-wide v2, 1223
+       float-to-long v0, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d
new file mode 100644
index 0000000..69d1e57
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_4.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 1
+
+       const v0, 3.14
+       float-to-long v0, v0
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d
new file mode 100644
index 0000000..148381a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_5.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       float-to-long v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d
new file mode 100644
index 0000000..99fa733
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_6.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       float-to-long v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d
new file mode 100644
index 0000000..30c969c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_float_to_long_7.java
+.class public dot.junit.opcodes.float_to_long.d.T_float_to_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       float-to-long v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java
new file mode 100644
index 0000000..58ae745
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.float_to_long.d;
+
+public class T_float_to_long_7 {
+
+    public long run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/Test_goto_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/Test_goto_16.java
new file mode 100644
index 0000000..2891fc4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/Test_goto_16.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.goto_16.d.T_goto_16_1;
+
+public class Test_goto_16 extends DxTestCase {
+       /**
+        * @title check forward and backward goto. This test also tests constraint C17 allowing to have
+        * backward goto as a last opcode in the method.
+        */
+       public void testN1() {
+           T_goto_16_1 t = new T_goto_16_1();
+           assertEquals(0, t.run(20));
+       }
+
+       /**
+        * @constraint A6 
+        * @title branch target is inside instruction
+        */
+       public void testVFE1() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_16.d.T_goto_16_3");
+               fail("expected a verification exception");
+           } catch (Throwable t) {
+               DxUtil.checkVerifyException(t);
+           }
+       }
+
+       /**
+        * @constraint A6 
+        * @title branch target shall be inside the method
+        */
+       public void testVFE2() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_16.d.T_goto_16_2");
+               fail("expected a verification exception");
+           } catch (Throwable t) {
+               DxUtil.checkVerifyException(t);
+           }
+       }
+
+       /**
+        * @constraint n/a 
+        * @title zero offset
+        */
+       public void testVFE3() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_16.d.T_goto_16_4");
+               fail("expected a verification exception");
+           } catch (Throwable t) {
+               DxUtil.checkVerifyException(t);
+           }
+       }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d
new file mode 100644
index 0000000..caa4ad0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_16_1.java
+.class public dot.junit.opcodes.goto_16.d.T_goto_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+; test positive offset
+      goto/16 Label2
+LabelReturn:      
+      return v4
+      
+Label2:
+       add-int/lit8 v4, v4, -1
+       if-lez v4, LabelExit
+; test negative offset       
+       goto/16 Label2
+       
+LabelExit:       
+       goto LabelReturn
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java
new file mode 100644
index 0000000..381d04f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_16.d;
+
+public class T_goto_16_1 {
+
+    public int run(int a) {
+        while (a > 0) {
+            a--;
+        }
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d
new file mode 100644
index 0000000..7162694
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_16_2.java
+.class public dot.junit.opcodes.goto_16.d.T_goto_16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto/16 Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh
new file mode 100644
index 0000000..9e83d7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_2.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : e5ec3c50
+    50 3C EC E5 
+// parsed: offset 12, len 20: signature           : 700a...7219
+    70 0A 71 39 79 DA 76 3F 7D B4 5A 82 07 EA 55 1E C7 F1 72 19 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "I"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 305 (0x000131) "II"
+    31 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 309 (0x000135) "Ldot/junit/opcodes/goto_16/d/T_goto_16_2;"
+    35 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 352 (0x000160) "Ljava/lang/Object;"
+    60 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 372 (0x000174) "T_goto_16_2.java"
+    74 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/goto_16/d/T_goto_16_2;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 288 (0x000120)
+    02 00 00 00 00 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/goto_16/d/T_goto_16_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_goto_16_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 398 (0x00018e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_2.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_2.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: goto/16 0004 // +0x0004
+//@mod            29 00 02 00
+            29 00 02 01
+        // parsed: offset 284, len 2: |0002: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 305, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 309, len 43: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/goto_16/d/T_goto_16_2;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 67 6F 74 6F 5F 31 36 2F 64 2F 54 5F 67 6F 74 6F 5F 31 36 5F 32 3B 00 
+// parsed: offset 352, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 372, len 18: TYPE_STRING_DATA_ITEM [5] "T_goto_16_2.java"
+    10 54 5F 67 6F 74 6F 5F 31 36 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/goto_16/d/T_goto_16_2;"
+    // parsed: offset 398, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 400, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 401, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 402, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 403, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 406, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 408, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 410, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 398 (0x00018e)
+        00 20 00 00 01 00 00 00 8E 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java
new file mode 100644
index 0000000..d9729a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_16.d;
+
+public class T_goto_16_2 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d
new file mode 100644
index 0000000..fcaa68d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_16_3.java
+.class public dot.junit.opcodes.goto_16.d.T_goto_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto/16 Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh
new file mode 100644
index 0000000..10045e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 77e43d0f
+    0F 3D E4 77 
+// parsed: offset 12, len 20: signature           : 8373...27f3
+    83 73 D6 CF 41 96 B2 D5 47 35 AB 73 18 04 6D FD 57 13 27 F3 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "I"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 305 (0x000131) "II"
+    31 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 309 (0x000135) "Ldot/junit/opcodes/goto_16/d/T_goto_16_3;"
+    35 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 352 (0x000160) "Ljava/lang/Object;"
+    60 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 372 (0x000174) "T_goto_16_3.java"
+    74 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/goto_16/d/T_goto_16_3;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 288 (0x000120)
+    02 00 00 00 00 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/goto_16/d/T_goto_16_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_goto_16_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 398 (0x00018e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_3.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_3.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: goto/16 0004 // +0x0004
+//@mod            29 00 02 00 
+            29 00 03 00 
+        // parsed: offset 284, len 2: |0002: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 305, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 309, len 43: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/goto_16/d/T_goto_16_3;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 67 6F 74 6F 5F 31 36 2F 64 2F 54 5F 67 6F 74 6F 5F 31 36 5F 33 3B 00 
+// parsed: offset 352, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 372, len 18: TYPE_STRING_DATA_ITEM [5] "T_goto_16_3.java"
+    10 54 5F 67 6F 74 6F 5F 31 36 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/goto_16/d/T_goto_16_3;"
+    // parsed: offset 398, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 400, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 401, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 402, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 403, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 406, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 408, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 410, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 398 (0x00018e)
+        00 20 00 00 01 00 00 00 8E 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d
new file mode 100644
index 0000000..746c325
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_16_4.java
+.class public dot.junit.opcodes.goto_16.d.T_goto_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto/16 Label1
+Label1:      
+      return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh
new file mode 100644
index 0000000..1b43042
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_16/d/T_goto_16_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 5cce3b13
+    13 3B CE 5C 
+// parsed: offset 12, len 20: signature           : f804...031e
+    F8 04 35 7B 64 32 AC 72 3D A1 7F 03 35 09 E1 77 49 DF 03 1E 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "I"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 305 (0x000131) "II"
+    31 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 309 (0x000135) "Ldot/junit/opcodes/goto_16/d/T_goto_16_4;"
+    35 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 352 (0x000160) "Ljava/lang/Object;"
+    60 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 372 (0x000174) "T_goto_16_4.java"
+    74 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/goto_16/d/T_goto_16_4;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 288 (0x000120)
+    02 00 00 00 00 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/goto_16/d/T_goto_16_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_goto_16_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 398 (0x00018e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_4.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.goto_16.d.T_goto_16_4.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: goto/16 0004 // +0x0004
+//@mod            29 00 02 00 
+            29 00 00 00 
+        // parsed: offset 284, len 2: |0002: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 305, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 309, len 43: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/goto_16/d/T_goto_16_4;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 67 6F 74 6F 5F 31 36 2F 64 2F 54 5F 67 6F 74 6F 5F 31 36 5F 34 3B 00 
+// parsed: offset 352, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 372, len 18: TYPE_STRING_DATA_ITEM [5] "T_goto_16_4.java"
+    10 54 5F 67 6F 74 6F 5F 31 36 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/goto_16/d/T_goto_16_4;"
+    // parsed: offset 398, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 400, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 401, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 402, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 403, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 406, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 408, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 410, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 398 (0x00018e)
+        00 20 00 00 01 00 00 00 8E 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java
new file mode 100644
index 0000000..4a087dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_16.d;
+
+public class T_goto_16_4 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/Test_goto_32.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/Test_goto_32.java
new file mode 100644
index 0000000..5f7a4dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/Test_goto_32.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_32;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.goto_32.d.T_goto_32_1;
+
+public class Test_goto_32 extends DxTestCase {
+       /**
+        * @title check forward and backward goto. This test also tests constraint C17 allowing to have
+        * backward goto as a last opcode in the method.
+        */
+       public void testN1() {
+           T_goto_32_1 t = new T_goto_32_1();
+           assertEquals(0, t.run(20));
+       }
+
+       /**
+        * @constraint A6 
+        * @title branch target is inside instruction
+        */
+       public void testVFE1() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_32.d.T_goto_32_2");
+               fail("expected a verification exception");
+           } catch (Throwable t) {
+               DxUtil.checkVerifyException(t);
+           }
+       }
+
+       /**
+        * @constraint A6 
+        * @title branch target shall be inside the method
+        */
+       public void testVFE2() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_32.d.T_goto_32_3");
+               fail("expected a verification exception");
+           } catch (Throwable t) {
+               DxUtil.checkVerifyException(t);
+           }
+       }
+
+       /**
+        *  
+        * @constraint n/a 
+        * @title zero offset - no exception expected
+        */
+       public void testVFE3() {
+           try {
+               Class.forName("dot.junit.opcodes.goto_32.d.T_goto_32_4");
+               // no exception is expected
+           } catch (Throwable t) {
+               fail("not expected" + t);
+           }
+       }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d
new file mode 100644
index 0000000..fd5335a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_32_1.java
+.class public dot.junit.opcodes.goto_32.d.T_goto_32_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+; test positive offset
+      goto/32 Label2
+LabelReturn:      
+      return v4
+      
+Label2:
+       add-int/lit8 v4, v4, -1
+       if-lez v4, LabelExit
+; test negative offset       
+       goto/32 Label2
+       
+LabelExit:       
+       goto LabelReturn
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java
new file mode 100644
index 0000000..90067e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_32.d;
+
+public class T_goto_32_1 {
+
+    public int run(int a) {
+        while (a > 0) {
+            a--;
+        }
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d
new file mode 100644
index 0000000..1a76901
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_32_2.java
+.class public dot.junit.opcodes.goto_32.d.T_goto_32_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto/32 Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh
new file mode 100644
index 0000000..4b28769
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh
@@ -0,0 +1,260 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_32/d/T_goto_32_2.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_32/d/T_goto_32_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 66653ef5
+    F5 3E 65 66 
+// parsed: offset 12, len 20: signature           : f397...b4a3
+    F3 97 87 FB A7 9D A8 95 06 46 CD 7D 6B 68 DE D4 68 21 B4 A3 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "I"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 305 (0x000131) "II"
+    31 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 309 (0x000135) "Ldot/junit/opcodes/goto_32/d/T_goto_32_2;"
+    35 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 352 (0x000160) "Ljava/lang/Object;"
+    60 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 372 (0x000174) "T_goto_32_2.java"
+    74 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/goto_32/d/T_goto_32_2;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 288 (0x000120)
+    02 00 00 00 00 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/goto_32/d/T_goto_32_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_goto_32_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 398 (0x00018e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.goto_32.d.T_goto_32_2.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.goto_32.d.T_goto_32_2.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: goto/32 #0x00000003
+//@mod            2A 00 03 00 00 00 
+            2A 00 03 00 00 10 
+        // parsed: offset 286, len 2: |0003: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 305, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 309, len 43: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/goto_32/d/T_goto_32_2;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 67 6F 74 6F 5F 33 32 2F 64 2F 54 5F 67 6F 74 6F 5F 33 32 5F 32 3B 00 
+// parsed: offset 352, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 372, len 18: TYPE_STRING_DATA_ITEM [5] "T_goto_32_2.java"
+    10 54 5F 67 6F 74 6F 5F 33 32 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/goto_32/d/T_goto_32_2;"
+    // parsed: offset 398, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 400, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 401, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 402, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 403, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 406, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 408, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 410, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 398 (0x00018e)
+        00 20 00 00 01 00 00 00 8E 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java
new file mode 100644
index 0000000..2f6d726
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.goto_32.d;
+
+public class T_goto_32_2 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d
new file mode 100644
index 0000000..6130ae8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_32_3.java
+.class public dot.junit.opcodes.goto_32.d.T_goto_32_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto/32 Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh
new file mode 100644
index 0000000..4d69427
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh
@@ -0,0 +1,260 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_32/d/T_goto_32_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/goto_32/d/T_goto_32_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : d7f03cc2
+    C2 3C F0 D7 
+// parsed: offset 12, len 20: signature           : 7597...1d22
+    75 97 05 E2 0A 6D AC B6 E0 92 5B 17 04 77 DE 99 7E F4 1D 22 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "I"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 305 (0x000131) "II"
+    31 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 309 (0x000135) "Ldot/junit/opcodes/goto_32/d/T_goto_32_3;"
+    35 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 352 (0x000160) "Ljava/lang/Object;"
+    60 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 372 (0x000174) "T_goto_32_3.java"
+    74 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/goto_32/d/T_goto_32_3;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 288 (0x000120)
+    02 00 00 00 00 00 00 00 20 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/goto_32/d/T_goto_32_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_goto_32_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 398 (0x00018e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.goto_32.d.T_goto_32_3.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.goto_32.d.T_goto_32_3.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: goto/32 #0x00000003
+//@mod            2A 00 03 00 00 00 
+            2A 00 04 00 00 00 
+        // parsed: offset 286, len 2: |0003: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 305, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 309, len 43: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/goto_32/d/T_goto_32_3;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 67 6F 74 6F 5F 33 32 2F 64 2F 54 5F 67 6F 74 6F 5F 33 32 5F 33 3B 00 
+// parsed: offset 352, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 372, len 18: TYPE_STRING_DATA_ITEM [5] "T_goto_32_3.java"
+    10 54 5F 67 6F 74 6F 5F 33 32 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/goto_32/d/T_goto_32_3;"
+    // parsed: offset 398, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 400, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 401, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 402, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 403, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 406, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 408, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 410, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 398 (0x00018e)
+        00 20 00 00 01 00 00 00 8E 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d
new file mode 100644
index 0000000..624dfaf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_goto_32_4.java
+.class public dot.junit.opcodes.goto_32.d.T_goto_32_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+Label1:
+      goto/32 Label1
+      return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/Test_if_eq.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/Test_if_eq.java
new file mode 100644
index 0000000..ed9b9e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/Test_if_eq.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_eq;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_eq.d.T_if_eq_1;
+import dot.junit.opcodes.if_eq.d.T_if_eq_2;
+import dot.junit.opcodes.if_eq.d.T_if_eq_4;
+
+public class Test_if_eq extends DxTestCase {
+    
+    /**
+     * @title Arguments = 5, 6
+     */
+    public void testN1() {
+        T_if_eq_1 t = new T_if_eq_1();
+        /*
+         * Compare with 1234 to check that in case of failed comparison
+         * execution proceeds at the address following if_eq instruction
+         */
+        assertEquals(1234, t.run(5, 6));
+    }
+
+    /**
+     * @title Arguments = 0x0f0e0d0c, 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Arguments = 5, -5
+     */
+    public void testN3() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1234, t.run(5, -5));
+    }
+
+    /**
+     * @title Arguments = 0x01001234, 0x1234
+     */
+    public void testN4() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1234, t.run(0x01001234, 0x1234));
+    }
+    
+    /**
+     * @title compare references
+     */
+    public void testN5() {
+        T_if_eq_2 t = new T_if_eq_2();
+        String a = "a";
+        String b = "b";
+        assertEquals(1234, t.run(a, b));
+    }
+
+    /**
+     * @title compare references
+     */
+    public void testN6() {
+        T_if_eq_2 t = new T_if_eq_2();
+        String a = "a";
+        assertEquals(1, t.run(a, a));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_if_eq_4 t = new T_if_eq_4();
+        assertEquals(1234, t.run(1f, 1));
+    }  
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 1234567
+     */
+    public void testB3() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1234, t.run(0, 1234567));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB4() {
+        T_if_eq_1 t = new T_if_eq_1();
+        assertEquals(1, t.run(0, 0));
+    }
+    
+    /**
+     * @title Compare reference with null
+     */
+    public void testB5() {
+        T_if_eq_2 t = new T_if_eq_2();
+        String a = "a";
+        assertEquals(1234, t.run(null, a));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title  zero offset
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eq.d.T_if_eq_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d
new file mode 100644
index 0000000..b9e4603
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d
@@ -0,0 +1,24 @@
+.source T_if_eq_1.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java
new file mode 100644
index 0000000..d9015d9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_1 {
+
+    public int run(int a, int b) {
+        return a == b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d
new file mode 100644
index 0000000..a7f0474
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d
@@ -0,0 +1,23 @@
+.source T_if_eq_10.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-eq v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh
new file mode 100644
index 0000000..d0c3c14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : ddba4029
+    29 40 BA DD 
+// parsed: offset 12, len 20: signature           : 888d...fb6f
+    88 8D 32 BC 19 C6 2A 6E 73 92 D4 07 A2 C9 A0 63 98 56 FB 6F 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_eq/d/T_if_eq_10;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_eq_10.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "Z"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 402 (0x000192) "ZII"
+    92 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_eq/d/T_if_eq_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_eq/d/T_if_eq_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_eq_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-eq v6, v7, 0004 // +0x0004
+//@mod      32 76 04 00 
+            32 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_eq/d/T_if_eq_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 2F 64 2F 54 5F 69 66 5F 65 71 5F 31 30 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_eq_10.java"
+    0F 54 5F 69 66 5F 65 71 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 402, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eq/d/T_if_eq_10;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java
new file mode 100644
index 0000000..6350454
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_10 {
+
+    public boolean run(int a, int b) {
+        return a == b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d
new file mode 100644
index 0000000..f266a25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d
@@ -0,0 +1,26 @@
+.source T_if_eq_11.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;Ljava/lang/String;)V
+.limit regs 8
+
+       if-eq v6, v7, Label10
+       const/4 v6, 0
+       return-void
+
+Label10:
+       const v6, 1
+       nop
+       nop
+       const/4 v6, 1
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh
new file mode 100644
index 0000000..b0293d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : f79d4878
+    78 48 9D F7 
+// parsed: offset 12, len 20: signature           : f49a...1f2e
+    F4 9A EE 46 B0 E3 E8 12 25 CB 9A BC D5 F7 87 9C F1 75 1F 2E 
+// parsed: offset 32, len 4: file_size           : 580
+    44 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 444 (0x0001bc)
+    BC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 340
+    54 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 312 (0x000138) "<init>"
+    38 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 320 (0x000140) "Ldot/junit/opcodes/if_eq/d/T_if_eq_11;"
+    40 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 360 (0x000168) "Ljava/lang/Object;"
+    68 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 380 (0x00017c) "Ljava/lang/String;"
+    7C 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 400 (0x000190) "T_if_eq_11.java"
+    90 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 417 (0x0001a1) "V"
+    A1 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 420 (0x0001a4) "VLL"
+    A4 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 425 (0x0001a9) "run"
+    A9 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/if_eq/d/T_if_eq_11;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/String;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "VLL"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 304 (0x000130)
+    06 00 00 00 03 00 00 00 30 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/if_eq/d/T_if_eq_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_eq_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 430 (0x0001ae)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 AE 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_11.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_11.run"
+    // parsed: offset 264, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 266, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 11
+        0B 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: if-eq v6, v7, 0004 // +0x0004
+//@mod            32 76 04 00 
+            32 76 05 00 
+        // parsed: offset 284, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 286, len 2: |0003: return-void
+            0E 00 
+        // parsed: offset 288, len 6: |0004: const v6, #float 0.000000 // #0x00000001 int
+            14 06 01 00 00 00 
+        // parsed: offset 294, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 296, len 2: |0008: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0009: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 300, len 2: |000a: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 302, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 304, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 308, len 2: type_item [0] type_idx: 2
+        02 00 
+    // parsed: offset 310, len 2: type_item [1] type_idx: 2
+        02 00 
+// parsed: offset 312, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 320, len 40: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/if_eq/d/T_if_eq_11;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 2F 64 2F 54 5F 69 66 5F 65 71 5F 31 31 3B 00 
+// parsed: offset 360, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 380, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 400, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_eq_11.java"
+    0F 54 5F 69 66 5F 65 71 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 417, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 420, len 5: TYPE_STRING_DATA_ITEM [6] "VLL"
+    03 56 4C 4C 00 
+// parsed: offset 425, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eq/d/T_if_eq_11;"
+    // parsed: offset 430, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 431, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 432, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 433, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 434, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 435, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 438, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 440, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 441, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 442, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 444, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 448, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 460, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 472, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 484, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 496, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 508, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 520, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 532, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 304 (0x000130)
+        01 10 00 00 01 00 00 00 30 01 00 00 
+    // parsed: offset 544, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 312 (0x000138)
+        02 20 00 00 08 00 00 00 38 01 00 00 
+    // parsed: offset 556, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 430 (0x0001ae)
+        00 20 00 00 01 00 00 00 AE 01 00 00 
+    // parsed: offset 568, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 444 (0x0001bc)
+        00 10 00 00 01 00 00 00 BC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java
new file mode 100644
index 0000000..3c5f8fd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_11 {
+
+    public boolean run(String a, String b) {
+        return a == b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d
new file mode 100644
index 0000000..9f0d34f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d
@@ -0,0 +1,24 @@
+.source T_if_eq_12.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh
new file mode 100644
index 0000000..f327ba6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh
@@ -0,0 +1,272 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_12.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_eq/d/T_if_eq_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 48be3ebd
+    BD 3E BE 48 
+// parsed: offset 12, len 20: signature           : 8ffe...1c12
+    8F FE A9 63 12 82 FD 99 23 44 02 D2 77 6A C4 D2 00 1A 1C 12 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 304 (0x000130) "<init>"
+    30 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 312 (0x000138) "I"
+    38 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 315 (0x00013b) "III"
+    3B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 320 (0x000140) "Ldot/junit/opcodes/if_eq/d/T_if_eq_12;"
+    40 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 360 (0x000168) "Ljava/lang/Object;"
+    68 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 380 (0x00017c) "T_if_eq_12.java"
+    7C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "run"
+    90 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/if_eq/d/T_if_eq_12;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "III"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 296 (0x000128)
+    02 00 00 00 00 00 00 00 28 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_eq/d/T_if_eq_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_if_eq_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 405 (0x000195)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 95 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_12.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eq.d.T_if_eq_12.run"
+    // parsed: offset 264, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 266, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 7
+        07 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: if-eq v6, v7, 0005 // +0x0005
+//@mod            32 76 05 00 
+            32 76 00 00 
+        // parsed: offset 284, len 4: |0002: const/16 v6, #int 1234 // #0x4d2
+            13 06 D2 04 
+        // parsed: offset 288, len 2: |0004: return v6
+            0F 06 
+        // parsed: offset 290, len 2: |0005: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 292, len 2: |0006: goto 0004 // -0x0002
+            28 FE 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 296, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 300, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 302, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 304, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 312, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 315, len 5: TYPE_STRING_DATA_ITEM [2] "III"
+    03 49 49 49 00 
+// parsed: offset 320, len 40: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/if_eq/d/T_if_eq_12;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 2F 64 2F 54 5F 69 66 5F 65 71 5F 31 32 3B 00 
+// parsed: offset 360, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 380, len 17: TYPE_STRING_DATA_ITEM [5] "T_if_eq_12.java"
+    0F 54 5F 69 66 5F 65 71 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eq/d/T_if_eq_12;"
+    // parsed: offset 405, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 406, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 408, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 409, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 410, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 413, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 415, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 416, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 417, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 419, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 296 (0x000128)
+        01 10 00 00 01 00 00 00 28 01 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 304 (0x000130)
+        02 20 00 00 08 00 00 00 30 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 405 (0x000195)
+        00 20 00 00 01 00 00 00 95 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d
new file mode 100644
index 0000000..239ef80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d
@@ -0,0 +1,24 @@
+.source T_if_eq_2.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;Ljava/lang/String;)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java
new file mode 100644
index 0000000..2e3f2e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_2 {
+
+    public int run(String a, String b) {
+        return a == b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d
new file mode 100644
index 0000000..8cc6f7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_if_eq_3.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java
new file mode 100644
index 0000000..e1d63c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_3 {
+
+    public int run(float a, float b) {
+        return a == b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d
new file mode 100644
index 0000000..614b6b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d
@@ -0,0 +1,24 @@
+.source T_if_eq_4.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java
new file mode 100644
index 0000000..8a85025
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_4 {
+
+    public int run(float a, int b) {
+        return a == b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d
new file mode 100644
index 0000000..94dd327
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d
@@ -0,0 +1,24 @@
+.source T_if_eq_5.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-eq v6, v8, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d
new file mode 100644
index 0000000..29f910b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_if_eq_6.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;Ljava/lang/String;)I
+.limit regs 8
+
+       if-eq v6, v8, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java
new file mode 100644
index 0000000..ab33d58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_eq.d;
+
+public class T_if_eq_6 {
+
+    public boolean run(int a, int b) {
+        return a == b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d
new file mode 100644
index 0000000..ded22b3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d
@@ -0,0 +1,24 @@
+.source T_if_eq_7.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-eq v5, v6, Label11
+       const/16 v5, 1234
+Label10:
+       return v5
+       
+Label11:
+       const/4 v5, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d
new file mode 100644
index 0000000..8e67f2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d
@@ -0,0 +1,24 @@
+.source T_if_eq_8.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-eq v5, v7, Label11
+       const/16 v5, 1234
+Label10:
+       return v5
+       
+Label11:
+       const/4 v5, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d
new file mode 100644
index 0000000..b158878
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d
@@ -0,0 +1,24 @@
+.source T_if_eq_9.java
+.class public dot.junit.opcodes.if_eq.d.T_if_eq_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ILjava/lang/String;)I
+.limit regs 8
+
+       if-eq v6, v7, Label11
+       const/16 v6, 1234
+Label10:
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       goto Label10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java
new file mode 100644
index 0000000..161ab3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java
@@ -0,0 +1,169 @@
+package dot.junit.opcodes.if_eqz;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_eqz.d.T_if_eqz_1;
+import dot.junit.opcodes.if_eqz.d.T_if_eqz_2;
+import dot.junit.opcodes.if_eqz.d.T_if_eqz_3;
+import dot.junit.opcodes.if_eqz.d.T_if_eqz_4;
+
+public class Test_if_eqz extends DxTestCase {
+
+    /**
+     * @title Argument = 5 and -5
+     */
+    public void testN1() {
+        T_if_eqz_1 t = new T_if_eqz_1();
+        /*
+         * Compare with 1234 to check that in case of failed comparison
+         * execution proceeds at the address following if_acmpeq instruction
+         */
+        assertEquals(1234, t.run(5));
+        assertEquals(1234, t.run(-5));
+    }
+
+    /**
+     * @title Arguments = not null
+     */
+    public void testN2() {
+        T_if_eqz_2 t = new T_if_eqz_2();
+        String str = "abc";
+        assertEquals(1234, t.run(str));
+    }
+    
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_if_eqz_3 t = new T_if_eqz_3();
+        assertEquals(1234, t.run(3.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_eqz_1 t = new T_if_eqz_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_eqz_1 t = new T_if_eqz_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE
+     */
+    public void testB3() {
+        T_if_eqz_3 t = new T_if_eqz_3();
+        assertEquals(1234, t.run(Float.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Float.MIN_VALUE
+     */
+    public void testB4() {
+        T_if_eqz_3 t = new T_if_eqz_3();
+        assertEquals(1234, t.run(Float.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB5() {
+        T_if_eqz_1 t = new T_if_eqz_1();
+        assertEquals(1, t.run(0));
+    }
+    
+    /**
+     * @title Compare with null
+     */
+    public void testB6() {
+        T_if_eqz_4 t = new T_if_eqz_4();
+        assertEquals(1, t.run(null));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title  branch must not be 0
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_eqz.d.T_if_eqz_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d
new file mode 100644
index 0000000..c44b870
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d
@@ -0,0 +1,23 @@
+.source T_ifne_1.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-eqz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java
new file mode 100644
index 0000000..69d7ec5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eqz.d;
+
+public class T_if_eqz_1 {
+
+    public int run(int a) {
+        return a == 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d
new file mode 100644
index 0000000..8c415d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d
@@ -0,0 +1,24 @@
+.source T_if_eqz_10.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-eqz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       const v5, 0
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh
new file mode 100644
index 0000000..8720c5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh
@@ -0,0 +1,278 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 13a54087
+    87 40 A5 13 
+// parsed: offset 12, len 20: signature           : f2ad...6186
+    F2 AD 32 32 6C 56 2F 5F 0C 66 01 AD C1 B4 D3 5A E5 69 61 86 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_10;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_eqz_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 405 (0x000195) "V"
+    95 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 408 (0x000198) "Z"
+    98 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 411 (0x00019b) "ZI"
+    9B 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_eqz_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_10.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-eqz v5, 0004 // +0x0004
+//@mod            38 05 04 00 
+            38 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 6: |0004: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_10;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 7A 2F 64 2F 54 5F 69 66 5F 65 71 7A 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_eqz_10.java"
+    10 54 5F 69 66 5F 65 71 7A 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 405, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 408, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 411, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d
new file mode 100644
index 0000000..af8ce95
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d
@@ -0,0 +1,23 @@
+.source T_if_eqz_11.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-eqz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh
new file mode 100644
index 0000000..9776e0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh
@@ -0,0 +1,274 @@
+// Processing '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dex'...
+// Opened '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 4c653f4a
+    4A 3F 65 4C 
+// parsed: offset 12, len 20: signature           : 64c4...a261
+    64 C4 0B 66 1A 5A 66 6E F4 C8 FA 14 8C 1E 4F 57 1F 9A A2 61 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_11;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_eqz_11.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "Z"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "ZI"
+    93 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_11;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_eqz_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_11.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_11.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-eqz v5, 0004 // +0x0004
+//@mod      38 05 04 00 
+            38 05 00 00            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_11;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 7A 2F 64 2F 54 5F 69 66 5F 65 71 7A 5F 31 31 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_eqz_11.java"
+    10 54 5F 69 66 5F 65 71 7A 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 403, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_11;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d
new file mode 100644
index 0000000..2b44068
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d
@@ -0,0 +1,23 @@
+.source T_ifne_2.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-eqz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java
new file mode 100644
index 0000000..288a1e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eqz.d;
+
+public class T_if_eqz_2 {
+
+    public int run(String o) {
+        return o == null ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d
new file mode 100644
index 0000000..84e6924
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d
@@ -0,0 +1,23 @@
+.source T_ifne_3.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-eqz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java
new file mode 100644
index 0000000..f328d0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eqz.d;
+
+public class T_if_eqz_3 {
+
+    public int run(float o) {
+        return o == 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d
new file mode 100644
index 0000000..5d0c921
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d
@@ -0,0 +1,23 @@
+.source T_ifne_4.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)I
+.limit regs 6
+
+       if-eqz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java
new file mode 100644
index 0000000..5d83f7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_eqz.d;
+
+public class T_if_eqz_4 {
+
+    public int run(Object o) {
+        return o == null ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d
new file mode 100644
index 0000000..3ddc469
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d
@@ -0,0 +1,23 @@
+.source T_ifne_5.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)I
+.limit regs 6
+
+       if-eqz v6, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d
new file mode 100644
index 0000000..ff120fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d
@@ -0,0 +1,23 @@
+.source T_ifne_6.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       if-eqz v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d
new file mode 100644
index 0000000..2d2ccb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d
@@ -0,0 +1,23 @@
+.source T_ifne_7.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-eqz v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d
new file mode 100644
index 0000000..4ff0e6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d
@@ -0,0 +1,23 @@
+.source T_if_eqz_9.java
+.class public dot.junit.opcodes.if_eqz.d.T_if_eqz_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-eqz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh
new file mode 100644
index 0000000..ee8a145
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 090e3d64
+    64 3D 0E 09 
+// parsed: offset 12, len 20: signature           : ca45...4c5d
+    CA 45 28 5D 29 16 13 16 67 BC 32 35 F3 8A C7 62 46 28 4C 5D 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_9;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_eqz_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_eqz_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_eqz.d.T_if_eqz_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-eqz v5, 0004 // +0x0004
+//@mod      38 05 04 00        
+            38 05 04 01 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 65 71 7A 2F 64 2F 54 5F 69 66 5F 65 71 7A 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_eqz_9.java"
+    0F 54 5F 69 66 5F 65 71 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_eqz/d/T_if_eqz_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/Test_if_ge.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/Test_if_ge.java
new file mode 100644
index 0000000..5c22637
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/Test_if_ge.java
@@ -0,0 +1,176 @@
+package dot.junit.opcodes.if_ge;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_ge.d.T_if_ge_1;
+import dot.junit.opcodes.if_ge.d.T_if_ge_3;
+
+public class Test_if_ge extends DxTestCase {
+    
+    /**
+     * @title Case: 5 < 6
+     */
+    public void testN1() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1234, t.run(5, 6));
+    }
+
+    /**
+     * @title Case: 0x0f0e0d0c = 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Case: 5 > -5
+     */
+    public void testN3() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(5, -5));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_if_ge_3 t = new T_if_ge_3();
+        assertEquals(1, t.run(1f, 1));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(0, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_if_ge_1 t = new T_if_ge_1();
+        assertEquals(1, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+     /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title  branch target shall 0
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ge.d.T_if_ge_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+   
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d
new file mode 100644
index 0000000..1279bbe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d
@@ -0,0 +1,23 @@
+.source T_if_ge_1.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ge v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java
new file mode 100644
index 0000000..b507e37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ge.d;
+
+public class T_if_ge_1 {
+
+    public int run(int a, int b) {
+        return a >= b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d
new file mode 100644
index 0000000..d02659a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d
@@ -0,0 +1,24 @@
+.source T_if_ge_10.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-ge v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       const v6, 0
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh
new file mode 100644
index 0000000..090fea5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh
@@ -0,0 +1,280 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 14003ffc
+    FC 3F 00 14 
+// parsed: offset 12, len 20: signature           : b8fa...6526
+    B8 FA D3 7A 8D D7 8E 82 0D 0E D1 33 C7 70 54 00 B1 30 65 26 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 316 (0x00013c) "<init>"
+    3C 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 324 (0x000144) "I"
+    44 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 327 (0x000147) "Ldot/junit/opcodes/if_ge/d/T_if_ge_10;"
+    47 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_ge_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 407 (0x000197) "Z"
+    97 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "ZII"
+    9A 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ge/d/T_if_ge_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ge/d/T_if_ge_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ge_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ge v6, v7, 0004 // +0x0004
+//@mod            35 76 04 00 
+            35 76 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 6: |0004: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 314, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 316, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 324, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 327, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ge/d/T_if_ge_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 2F 64 2F 54 5F 69 66 5F 67 65 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ge_10.java"
+    0F 54 5F 69 66 5F 67 65 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 407, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ge/d/T_if_ge_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 316 (0x00013c)
+        02 20 00 00 09 00 00 00 3C 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d
new file mode 100644
index 0000000..667364d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_ge_11.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ge v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh
new file mode 100644
index 0000000..730462e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh
@@ -0,0 +1,272 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_11.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 07f43ba4
+    A4 3B F4 07 
+// parsed: offset 12, len 20: signature           : 0ddb...f74e
+    0D DB 24 02 D1 3C 3B 83 6B 43 22 39 49 49 55 12 39 79 F7 4E 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 304 (0x000130) "<init>"
+    30 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 312 (0x000138) "I"
+    38 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 315 (0x00013b) "III"
+    3B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 320 (0x000140) "Ldot/junit/opcodes/if_ge/d/T_if_ge_11;"
+    40 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 360 (0x000168) "Ljava/lang/Object;"
+    68 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 380 (0x00017c) "T_if_ge_11.java"
+    7C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "run"
+    90 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/if_ge/d/T_if_ge_11;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "III"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 296 (0x000128)
+    02 00 00 00 00 00 00 00 28 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ge/d/T_if_ge_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_if_ge_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 405 (0x000195)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 95 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_11.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_11.run"
+    // parsed: offset 264, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 266, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 7
+        07 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: if-ge v6, v7, 0005 // +0x0005
+//@mod            35 76 05 00 
+            35 76 00 00 
+        // parsed: offset 284, len 4: |0002: const/16 v6, #int 1234 // #0x4d2
+            13 06 D2 04 
+        // parsed: offset 288, len 2: |0004: return v6
+            0F 06 
+        // parsed: offset 290, len 2: |0005: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 292, len 2: |0006: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 296, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 300, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 302, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 304, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 312, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 315, len 5: TYPE_STRING_DATA_ITEM [2] "III"
+    03 49 49 49 00 
+// parsed: offset 320, len 40: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/if_ge/d/T_if_ge_11;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 2F 64 2F 54 5F 69 66 5F 67 65 5F 31 31 3B 00 
+// parsed: offset 360, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 380, len 17: TYPE_STRING_DATA_ITEM [5] "T_if_ge_11.java"
+    0F 54 5F 69 66 5F 67 65 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ge/d/T_if_ge_11;"
+    // parsed: offset 405, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 406, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 408, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 409, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 410, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 413, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 415, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 416, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 417, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 419, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 296 (0x000128)
+        01 10 00 00 01 00 00 00 28 01 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 304 (0x000130)
+        02 20 00 00 08 00 00 00 30 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 405 (0x000195)
+        00 20 00 00 01 00 00 00 95 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d
new file mode 100644
index 0000000..af33b07
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_ge_2.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       if-ge v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java
new file mode 100644
index 0000000..64014ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_ge.d;
+
+public class T_if_ge_2 {
+
+    public int run(float a, float b) {
+        return a >= b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d
new file mode 100644
index 0000000..876dcdc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d
@@ -0,0 +1,23 @@
+.source T_if_ge_3.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       if-ge v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java
new file mode 100644
index 0000000..d524e1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ge.d;
+
+public class T_if_ge_3 {
+
+    public int run(float a, int b) {
+        return a >= b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d
new file mode 100644
index 0000000..3593702
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d
@@ -0,0 +1,23 @@
+.source T_if_ge_4.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ge v6, v8, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d
new file mode 100644
index 0000000..ddf627e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d
@@ -0,0 +1,23 @@
+.source T_if_ge_5.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-ge v5, v6, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d
new file mode 100644
index 0000000..74e3506
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d
@@ -0,0 +1,23 @@
+.source T_if_ge_6.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-ge v5, v7, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d
new file mode 100644
index 0000000..b3559bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d
@@ -0,0 +1,23 @@
+.source T_if_ge_7.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;I)I
+.limit regs 8
+
+       if-ge v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d
new file mode 100644
index 0000000..254da33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d
@@ -0,0 +1,23 @@
+.source T_if_ge_9.java
+.class public dot.junit.opcodes.if_ge.d.T_if_ge_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-ge v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh
new file mode 100644
index 0000000..3f4b044
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ge/d/T_if_ge_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c6b54091
+    91 40 B5 C6 
+// parsed: offset 12, len 20: signature           : a65c...e5f5
+    A6 5C 79 D3 A9 EE BA 8C 74 66 B9 7A 38 6E 20 6C 12 E5 E5 F5 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_ge/d/T_if_ge_9;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_ge_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "Z"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "ZII"
+    90 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ge/d/T_if_ge_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ge/d/T_if_ge_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ge_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ge.d.T_if_ge_9.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ge v6, v7, 0004 // +0x0004
+//@mod      35 76 04 00 
+            35 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 39: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ge/d/T_if_ge_9;"
+    25 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 2F 64 2F 54 5F 69 66 5F 67 65 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 16: TYPE_STRING_DATA_ITEM [4] "T_if_ge_9.java"
+    0E 54 5F 69 66 5F 67 65 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ge/d/T_if_ge_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/Test_if_gez.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/Test_if_gez.java
new file mode 100644
index 0000000..da97922
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/Test_if_gez.java
@@ -0,0 +1,151 @@
+package dot.junit.opcodes.if_gez;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_gez.d.T_if_gez_1;
+import dot.junit.opcodes.if_gez.d.T_if_gez_2;
+
+public class Test_if_gez extends DxTestCase {
+    
+    /**
+     * @title Argument = 5
+     */
+    public void testN1() {
+        T_if_gez_1 t = new T_if_gez_1();
+        assertEquals(1, t.run(5));
+    }
+
+    /**
+     * @title Argument = -5
+     */
+    public void testN2() {
+        T_if_gez_1 t = new T_if_gez_1();
+        assertEquals(1234, t.run(-5));
+    }
+
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_if_gez_2 t = new T_if_gez_2();
+        assertEquals(1, t.run(1.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_gez_1 t = new T_if_gez_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_gez_1 t = new T_if_gez_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB3() {
+        T_if_gez_1 t = new T_if_gez_1();
+        assertEquals(1, t.run(0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title  branch must not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gez.d.T_if_gez_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d
new file mode 100644
index 0000000..85145e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d
@@ -0,0 +1,23 @@
+.source T_if_gez_1.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java
new file mode 100644
index 0000000..462ed6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gez.d;
+
+public class T_if_gez_1 {
+
+    public int run(int a) {
+        return a >= 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d
new file mode 100644
index 0000000..503c0be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d
@@ -0,0 +1,23 @@
+.source T_if_gez_10.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh
new file mode 100644
index 0000000..b4fa6dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh
@@ -0,0 +1,274 @@
+// Processing '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_10.dex'...
+// Opened '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 5d7e4122
+    22 41 7E 5D 
+// parsed: offset 12, len 20: signature           : 9bea...7f9b
+    9B EA D8 28 0E 81 13 A4 C2 E3 5E 59 A7 CC B3 E4 1A 47 7F 9B 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_gez/d/T_if_gez_10;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_gez_10.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "Z"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "ZI"
+    93 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gez/d/T_if_gez_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gez/d/T_if_gez_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gez_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_10.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gez v5, 0004 // +0x0004
+//@mod      3B 05 04 00 
+            3B 05 00 00            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gez/d/T_if_gez_10;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 7A 2F 64 2F 54 5F 69 66 5F 67 65 7A 5F 31 30 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_gez_10.java"
+    10 54 5F 69 66 5F 67 65 7A 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 403, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gez/d/T_if_gez_10;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d
new file mode 100644
index 0000000..3d0a858
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d
@@ -0,0 +1,23 @@
+.source T_if_gez_2.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-gez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java
new file mode 100644
index 0000000..55d7605
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gez.d;
+
+public class T_if_gez_2 {
+
+    public int run(float a) {
+        return a >= 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d
new file mode 100644
index 0000000..a4bda68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d
@@ -0,0 +1,23 @@
+.source T_if_gez_3.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gez v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d
new file mode 100644
index 0000000..4a60845
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d
@@ -0,0 +1,23 @@
+.source T_if_gez_4.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 6
+
+       if-gez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d
new file mode 100644
index 0000000..c3d88e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d
@@ -0,0 +1,23 @@
+.source T_if_gez_5.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-gez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d
new file mode 100644
index 0000000..666d59f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d
@@ -0,0 +1,23 @@
+.source T_if_gez_6.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-gez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d
new file mode 100644
index 0000000..9534ba0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_gez_7.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gez v0, Label9
+       const/16 v0, 1234
+       return v0
+
+Label9:
+       const/4 v0, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d
new file mode 100644
index 0000000..f1df2d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d
@@ -0,0 +1,23 @@
+.source T_if_gez_8.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh
new file mode 100644
index 0000000..307f59d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 743e41c9
+    C9 41 3E 74 
+// parsed: offset 12, len 20: signature           : 8137...c1a7
+    81 37 BE DD 96 E5 E3 AE 8E C3 09 D0 A5 41 3C 1A AC EC C1 A7 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_gez/d/T_if_gez_8;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_gez_8.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gez/d/T_if_gez_8;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gez/d/T_if_gez_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gez_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_8.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gez v5, 0004 // +0x0004
+//@mod      3B 05 04 00 
+            3B 05 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gez/d/T_if_gez_8;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 7A 2F 64 2F 54 5F 69 66 5F 67 65 7A 5F 38 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_gez_8.java"
+    0F 54 5F 69 66 5F 67 65 7A 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gez/d/T_if_gez_8;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d
new file mode 100644
index 0000000..a0b7545
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d
@@ -0,0 +1,24 @@
+.source T_if_gez_9.java
+.class public dot.junit.opcodes.if_gez.d.T_if_gez_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       const v5, 0
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh
new file mode 100644
index 0000000..4c24707
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_gez/d/T_if_gez_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : f5534081
+    81 40 53 F5 
+// parsed: offset 12, len 20: signature           : 01ee...5008
+    01 EE F6 9D DC E2 4D 51 1B 8B 52 BC 5D A5 3C 9C 1B F0 50 08 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_gez/d/T_if_gez_9;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 366 (0x00016e) "Ljava/lang/Object;"
+    6E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 386 (0x000182) "T_if_gez_9.java"
+    82 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 403 (0x000193) "V"
+    93 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 406 (0x000196) "Z"
+    96 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 409 (0x000199) "ZI"
+    99 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 413 (0x00019d) "run"
+    9D 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gez/d/T_if_gez_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gez/d/T_if_gez_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gez_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 418 (0x0001a2)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A2 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gez.d.T_if_gez_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gez v5, 0004 // +0x0004
+//@mod            3B 05 04 00 
+            3B 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 6: |0004: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gez/d/T_if_gez_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 65 7A 2F 64 2F 54 5F 69 66 5F 67 65 7A 5F 39 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 386, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_gez_9.java"
+    0F 54 5F 69 66 5F 67 65 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 403, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 406, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 409, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 413, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gez/d/T_if_gez_9;"
+    // parsed: offset 418, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 419, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 420, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 421, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 423, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 426, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 428, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 429, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 430, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 418 (0x0001a2)
+        00 20 00 00 01 00 00 00 A2 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/Test_if_gt.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/Test_if_gt.java
new file mode 100644
index 0000000..862ba4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/Test_if_gt.java
@@ -0,0 +1,175 @@
+package dot.junit.opcodes.if_gt;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_gt.d.T_if_gt_1;
+import dot.junit.opcodes.if_gt.d.T_if_gt_3;
+
+public class Test_if_gt extends DxTestCase {
+
+    /**
+     * @title Case: 5 < 6
+     */
+    public void testN1() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1234, t.run(5, 6));
+    }
+
+    /**
+     * @title Case: 0x0f0e0d0c = 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1234, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Case: 5 > -5
+     */
+    public void testN3() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1, t.run(5, -5));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_if_gt_3 t = new T_if_gt_3();
+        assertEquals(1, t.run(1f, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1, t.run(0, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_if_gt_1 t = new T_if_gt_1();
+        assertEquals(1234, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a 
+     * @title  branch target shall not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gt.d.T_if_gt_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d
new file mode 100644
index 0000000..293c1ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d
@@ -0,0 +1,23 @@
+.source T_if_gt_1.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java
new file mode 100644
index 0000000..b71142f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gt.d;
+
+public class T_if_gt_1 {
+
+    public int run(int a, int b) {
+        return a > b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d
new file mode 100644
index 0000000..7dd9ab7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d
@@ -0,0 +1,24 @@
+.source T_if_gt_10.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/4 v6, 0
+       return v6
+
+Label11:
+       const v6, 0
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh
new file mode 100644
index 0000000..6d0aaad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh
@@ -0,0 +1,280 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 0e2c42e5
+    E5 42 2C 0E 
+// parsed: offset 12, len 20: signature           : eb64...07d7
+    EB 64 9E 9B AE C0 F1 D7 E7 75 AE 37 77 BF 2B BB 7A D1 07 D7 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 316 (0x00013c) "<init>"
+    3C 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 324 (0x000144) "I"
+    44 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 327 (0x000147) "Ldot/junit/opcodes/if_gt/d/T_if_gt_10;"
+    47 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_gt_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 407 (0x000197) "Z"
+    97 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "ZII"
+    9A 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gt/d/T_if_gt_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gt/d/T_if_gt_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gt_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gt v6, v7, 0004 // +0x0004
+//@mod            36 76 04 00 
+            36 76 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 6: |0004: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 314, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 316, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 324, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 327, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gt/d/T_if_gt_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 2F 64 2F 54 5F 69 66 5F 67 74 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_gt_10.java"
+    0F 54 5F 69 66 5F 67 74 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 407, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gt/d/T_if_gt_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 316 (0x00013c)
+        02 20 00 00 09 00 00 00 3C 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d
new file mode 100644
index 0000000..13fa794
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_gt_11.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh
new file mode 100644
index 0000000..9822137
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh
@@ -0,0 +1,278 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_11.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 6c2e423c
+    3C 42 2E 6C 
+// parsed: offset 12, len 20: signature           : 5443...b674
+    54 43 D6 BD FA E8 4D 02 23 47 91 E4 D9 A6 90 BB B7 BD B6 74 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 312 (0x000138) "<init>"
+    38 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 320 (0x000140) "F"
+    40 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 323 (0x000143) "I"
+    43 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 326 (0x000146) "IFF"
+    46 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 331 (0x00014b) "Ldot/junit/opcodes/if_gt/d/T_if_gt_11;"
+    4B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 371 (0x000173) "Ljava/lang/Object;"
+    73 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 391 (0x000187) "T_if_gt_11.java"
+    87 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 408 (0x000198) "V"
+    98 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 411 (0x00019b) "run"
+    9B 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "F"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "I"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ldot/junit/opcodes/if_gt/d/T_if_gt_11;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "Ljava/lang/Object;"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "V"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 3 (0x000003) "IFF"
+//     return_type_idx: 1 (0x000001) "I"
+//     parameters_off: 304 (0x000130)
+    03 00 00 00 01 00 00 00 30 01 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "V"
+//     return_type_idx: 4 (0x000004) "V"
+//     parameters_off: 0 (0x000000)
+    07 00 00 00 04 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 8 (0x000008) "run"
+    02 00 00 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 3 (0x000003)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    03 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 2 "Ldot/junit/opcodes/if_gt/d/T_if_gt_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 3 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 6 "T_if_gt_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 416 (0x0001a0)
+//     static_values_off: 0 (0x000000)
+    02 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 A0 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_11.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_11.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 7
+        07 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gt v6, v7, 0005 // +0x0005
+//@mod            36 76 05 00 
+            36 76 00 00 
+        // parsed: offset 292, len 4: |0002: const/16 v6, #int 1234 // #0x4d2
+            13 06 D2 04 
+        // parsed: offset 296, len 2: |0004: return v6
+            0F 06 
+        // parsed: offset 298, len 2: |0005: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 300, len 2: |0006: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 302, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 304, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 308, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 310, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 312, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 320, len 3: TYPE_STRING_DATA_ITEM [1] "F"
+    01 46 00 
+// parsed: offset 323, len 3: TYPE_STRING_DATA_ITEM [2] "I"
+    01 49 00 
+// parsed: offset 326, len 5: TYPE_STRING_DATA_ITEM [3] "IFF"
+    03 49 46 46 00 
+// parsed: offset 331, len 40: TYPE_STRING_DATA_ITEM [4] "Ldot/junit/opcodes/if_gt/d/T_if_gt_11;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 2F 64 2F 54 5F 69 66 5F 67 74 5F 31 31 3B 00 
+// parsed: offset 371, len 20: TYPE_STRING_DATA_ITEM [5] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 391, len 17: TYPE_STRING_DATA_ITEM [6] "T_if_gt_11.java"
+    0F 54 5F 69 66 5F 67 74 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 408, len 3: TYPE_STRING_DATA_ITEM [7] "V"
+    01 56 00 
+// parsed: offset 411, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gt/d/T_if_gt_11;"
+    // parsed: offset 416, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 417, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 418, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 419, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 421, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 424, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 426, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 427, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 428, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 430, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 304 (0x000130)
+        01 10 00 00 01 00 00 00 30 01 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 312 (0x000138)
+        02 20 00 00 09 00 00 00 38 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 416 (0x0001a0)
+        00 20 00 00 01 00 00 00 A0 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d
new file mode 100644
index 0000000..30e3b81
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_gt_2.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java
new file mode 100644
index 0000000..136d619
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_gt.d;
+
+public class T_if_gt_2 {
+
+    public int run(float a, float b) {
+        return a > b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d
new file mode 100644
index 0000000..75d4d17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d
@@ -0,0 +1,23 @@
+.source T_if_gt_3.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java
new file mode 100644
index 0000000..9d53767
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gt.d;
+
+public class T_if_gt_3 {
+
+    public int run(float a, int b) {
+        return a > b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d
new file mode 100644
index 0000000..f1ebef1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d
@@ -0,0 +1,23 @@
+.source T_if_gt_4.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-gt v7, v8, Label11
+       const/16 v7, 1234
+       return v7
+
+Label11:
+       const/4 v7, 1
+       return v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d
new file mode 100644
index 0000000..829291b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d
@@ -0,0 +1,23 @@
+.source T_if_gt_5.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-gt v5, v6, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d
new file mode 100644
index 0000000..39b3541
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d
@@ -0,0 +1,23 @@
+.source T_if_gt_6.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-gt v5, v7, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d
new file mode 100644
index 0000000..88b8364
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d
@@ -0,0 +1,23 @@
+.source T_if_gt_7.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;I)I
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d
new file mode 100644
index 0000000..8325322
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_gt_8.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-gt v6, v0, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d
new file mode 100644
index 0000000..198d870
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d
@@ -0,0 +1,23 @@
+.source T_if_gt_9.java
+.class public dot.junit.opcodes.if_gt.d.T_if_gt_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-gt v6, v7, Label11
+       const/4 v6, 0
+       return v6
+
+Label11:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh
new file mode 100644
index 0000000..a9549db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_gt/d/T_if_gt_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c6c73e51
+    51 3E C7 C6 
+// parsed: offset 12, len 20: signature           : e023...c1e9
+    E0 23 56 87 13 06 4B 95 E5 A7 64 7B 18 5C 6F 2D BC 12 C1 E9 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_gt/d/T_if_gt_9;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_gt_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "Z"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "ZII"
+    90 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gt/d/T_if_gt_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gt/d/T_if_gt_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gt_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gt.d.T_if_gt_9.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gt v6, v7, 0004 // +0x0004
+//@mod      36 76 04 00 
+            36 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 39: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gt/d/T_if_gt_9;"
+    25 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 2F 64 2F 54 5F 69 66 5F 67 74 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 16: TYPE_STRING_DATA_ITEM [4] "T_if_gt_9.java"
+    0E 54 5F 69 66 5F 67 74 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gt/d/T_if_gt_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java
new file mode 100644
index 0000000..86a5535
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java
@@ -0,0 +1,151 @@
+package dot.junit.opcodes.if_gtz;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_gtz.d.T_if_gtz_1;
+import dot.junit.opcodes.if_gtz.d.T_if_gtz_2;
+
+public class Test_if_gtz extends DxTestCase {
+
+    /**
+     * @title Argument = 5
+     */
+    public void testN1() {
+        T_if_gtz_1 t = new T_if_gtz_1();
+        assertEquals(1, t.run(5));
+    }
+
+    /**
+     * @title Argument = -5
+     */
+    public void testN2() {
+        T_if_gtz_1 t = new T_if_gtz_1();
+        assertEquals(1234, t.run(-5));
+    }
+
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_if_gtz_2 t = new T_if_gtz_2();
+        assertEquals(1, t.run(1.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_gtz_1 t = new T_if_gtz_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_gtz_1 t = new T_if_gtz_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB3() {
+        T_if_gtz_1 t = new T_if_gtz_1();
+        assertEquals(1234, t.run(0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title  branch must not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_gtz.d.T_if_gtz_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d
new file mode 100644
index 0000000..2207436
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_1.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gtz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java
new file mode 100644
index 0000000..cca881f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gtz.d;
+
+public class T_if_gtz_1 {
+
+    public int run(int a) {
+        return a > 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d
new file mode 100644
index 0000000..4119a6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d
@@ -0,0 +1,24 @@
+.source T_if_gtz_10.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gtz v5, Label8
+       const/4 v0, 0
+       return v0
+
+Label8:
+       nop
+       const v0, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh
new file mode 100644
index 0000000..5007f63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh
@@ -0,0 +1,278 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 63564126
+    26 41 56 63 
+// parsed: offset 12, len 20: signature           : a735...e471
+    A7 35 3A 24 84 99 A8 9A B8 55 11 8C 64 FC 37 6F C2 8A E4 71 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_10;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_gtz_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 405 (0x000195) "V"
+    95 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 408 (0x000198) "Z"
+    98 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 411 (0x00019b) "ZI"
+    9B 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gtz_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_10.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gtz v5, 0004 // +0x0004
+//@mod            3C 05 04 00 
+            3C 05 00 00 
+        // parsed: offset 292, len 2: |0002: const/4 v0, #int 0 // #0x0
+            12 00 
+        // parsed: offset 294, len 2: |0003: return v0
+            0F 00 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 6: |0005: const v0, #float 0.000000 // #0x00000000 int
+            14 00 00 00 00 00 
+        // parsed: offset 304, len 2: |0008: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_10;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 7A 2F 64 2F 54 5F 69 66 5F 67 74 7A 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_gtz_10.java"
+    10 54 5F 69 66 5F 67 74 7A 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 405, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 408, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 411, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d
new file mode 100644
index 0000000..b57c6ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_2.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-gtz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java
new file mode 100644
index 0000000..ea1def0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_gtz.d;
+
+public class T_if_gtz_2 {
+
+    public int run(float a) {
+        return a > 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d
new file mode 100644
index 0000000..c2db4b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_3.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gtz v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d
new file mode 100644
index 0000000..98e01e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_4.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 6
+
+       if-gtz v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d
new file mode 100644
index 0000000..29f8800
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_5.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-gtz v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d
new file mode 100644
index 0000000..a91668e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_6.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-gtz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d
new file mode 100644
index 0000000..71a5bfc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_gtz_7.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-gtz v0, Label9
+       const/16 v0, 1234
+       return v0
+
+Label9:
+       const/4 v0, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d
new file mode 100644
index 0000000..5bf3d9c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d
@@ -0,0 +1,24 @@
+.source T_if_gtz_8.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gtz v5, Label8
+       const/4 v0, 0
+       return v0
+
+Label8:
+       nop
+       const/4 v0, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh
new file mode 100644
index 0000000..2af60bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh
@@ -0,0 +1,276 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 00484033
+    33 40 48 00 
+// parsed: offset 12, len 20: signature           : d58a...b651
+    D5 8A 12 27 F2 10 E0 5C 52 C9 68 FB 6C 6D 37 15 4D E8 B6 51 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 310 (0x000136) "<init>"
+    36 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 318 (0x00013e) "I"
+    3E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 321 (0x000141) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_8;"
+    41 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 362 (0x00016a) "Ljava/lang/Object;"
+    6A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 382 (0x00017e) "T_if_gtz_8.java"
+    7E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 399 (0x00018f) "V"
+    8F 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 402 (0x000192) "Z"
+    92 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 405 (0x000195) "ZI"
+    95 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 409 (0x000199) "run"
+    99 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_8;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 304 (0x000130)
+    07 00 00 00 04 00 00 00 30 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gtz_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 414 (0x00019e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_8.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 7
+        07 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gtz v5, 0004 // +0x0004
+//@mod            3C 05 04 00 
+            3C 05 04 01 
+        // parsed: offset 292, len 2: |0002: const/4 v0, #int 0 // #0x0
+            12 00 
+        // parsed: offset 294, len 2: |0003: return v0
+            0F 00 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: const/4 v0, #int 0 // #0x0
+            12 00 
+        // parsed: offset 300, len 2: |0006: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 302, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 304, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 308, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 310, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 318, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 321, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_8;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 7A 2F 64 2F 54 5F 69 66 5F 67 74 7A 5F 38 3B 00 
+// parsed: offset 362, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 382, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_gtz_8.java"
+    0F 54 5F 69 66 5F 67 74 7A 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 402, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 405, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 409, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_8;"
+    // parsed: offset 414, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 415, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 416, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 417, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 419, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 422, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 425, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 426, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 304 (0x000130)
+        01 10 00 00 01 00 00 00 30 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 310 (0x000136)
+        02 20 00 00 09 00 00 00 36 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 414 (0x00019e)
+        00 20 00 00 01 00 00 00 9E 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d
new file mode 100644
index 0000000..08e8ff9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d
@@ -0,0 +1,23 @@
+.source T_if_gtz_9.java
+.class public dot.junit.opcodes.if_gtz.d.T_if_gtz_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-gtz v5, Label8
+       const/4 v0, 0
+       return v0
+
+Label8:
+       const v0, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh
new file mode 100644
index 0000000..1c600fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 910f41e3
+    E3 41 0F 91 
+// parsed: offset 12, len 20: signature           : 897e...e923
+    89 7E 66 D4 A6 63 A4 C3 FF C5 35 EC 5B 7C 65 85 1B E2 E9 23 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 310 (0x000136) "<init>"
+    36 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 318 (0x00013e) "I"
+    3E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 321 (0x000141) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_9;"
+    41 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 362 (0x00016a) "Ljava/lang/Object;"
+    6A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 382 (0x00017e) "T_if_gtz_9.java"
+    7E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 399 (0x00018f) "V"
+    8F 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 402 (0x000192) "Z"
+    92 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 405 (0x000195) "ZI"
+    95 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 409 (0x000199) "run"
+    99 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 304 (0x000130)
+    07 00 00 00 04 00 00 00 30 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_gtz_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 414 (0x00019e)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9E 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_gtz.d.T_if_gtz_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-gtz v5, 0004 // +0x0004
+//@mod            3C 05 04 00 
+            3C 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v0, #int 0 // #0x0
+            12 00 
+        // parsed: offset 294, len 2: |0003: return v0
+            0F 00 
+        // parsed: offset 296, len 6: |0004: const v0, #float 0.000000 // #0x00000000 int
+            14 00 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 304, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 308, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 310, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 318, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 321, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 67 74 7A 2F 64 2F 54 5F 69 66 5F 67 74 7A 5F 39 3B 00 
+// parsed: offset 362, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 382, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_gtz_9.java"
+    0F 54 5F 69 66 5F 67 74 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 402, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 405, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 409, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_gtz/d/T_if_gtz_9;"
+    // parsed: offset 414, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 415, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 416, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 417, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 419, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 422, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 425, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 426, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 304 (0x000130)
+        01 10 00 00 01 00 00 00 30 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 310 (0x000136)
+        02 20 00 00 09 00 00 00 36 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 414 (0x00019e)
+        00 20 00 00 01 00 00 00 9E 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/Test_if_le.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/Test_if_le.java
new file mode 100644
index 0000000..852324b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/Test_if_le.java
@@ -0,0 +1,176 @@
+package dot.junit.opcodes.if_le;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_le.d.T_if_le_1;
+import dot.junit.opcodes.if_le.d.T_if_le_11;
+
+public class Test_if_le extends DxTestCase {
+    
+    /**
+     * @title Case: 5 < 6
+     */
+    public void testN1() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1, t.run(5, 6));
+    }
+
+    /**
+     * @title Case: 0x0f0e0d0c = 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Case: 5 > -5
+     */
+    public void testN3() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1234, t.run(5, -5));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_if_le_11 t = new T_if_le_11();
+        assertEquals(1, t.run(1, 1f));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1234, t.run(0, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_if_le_1 t = new T_if_le_1();
+        assertEquals(1, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a 
+     * @title branch target shall not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_le.d.T_if_le_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.d
new file mode 100644
index 0000000..a9fbd14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.d
@@ -0,0 +1,23 @@
+.source T_if_le_1.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-le v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.java
new file mode 100644
index 0000000..65d5da6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_le.d;
+
+public class T_if_le_1 {
+
+    public int run(int a, int b) {
+        return a <= b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.d
new file mode 100644
index 0000000..7c9ca12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.d
@@ -0,0 +1,24 @@
+.source T_if_le_10.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-le v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       const v6, 0
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh
new file mode 100644
index 0000000..9c55965
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh
@@ -0,0 +1,280 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 0713407a
+    7A 40 13 07 
+// parsed: offset 12, len 20: signature           : eb53...56c4
+    EB 53 CD DC C5 02 DC 05 C8 B3 F8 3D 81 26 1E 13 2F 96 56 C4 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 316 (0x00013c) "<init>"
+    3C 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 324 (0x000144) "I"
+    44 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 327 (0x000147) "Ldot/junit/opcodes/if_le/d/T_if_le_10;"
+    47 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_le_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 407 (0x000197) "Z"
+    97 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "ZII"
+    9A 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_le/d/T_if_le_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_le/d/T_if_le_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_le_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-le v6, v7, 0004 // +0x0004
+//@mod            37 76 04 00 
+            37 76 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 6: |0004: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 314, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 316, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 324, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 327, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_le/d/T_if_le_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 2F 64 2F 54 5F 69 66 5F 6C 65 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_le_10.java"
+    0F 54 5F 69 66 5F 6C 65 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 407, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_le/d/T_if_le_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 316 (0x00013c)
+        02 20 00 00 09 00 00 00 3C 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.d
new file mode 100644
index 0000000..aaeecc9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.d
@@ -0,0 +1,23 @@
+.source T_if_le_11.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 8
+
+       if-le v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.java
new file mode 100644
index 0000000..b92d796
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_11.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_le.d;
+
+public class T_if_le_11 {
+
+    public int run(int a, float b) {
+        return a <= b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.d
new file mode 100644
index 0000000..2f9f581
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.d
@@ -0,0 +1,23 @@
+.source T_if_le_12.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-le v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh
new file mode 100644
index 0000000..a8735cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh
@@ -0,0 +1,272 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_12.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : cae53e73
+    73 3E E5 CA 
+// parsed: offset 12, len 20: signature           : 28b0...6742
+    28 B0 39 0C B7 33 C6 C9 90 4E 13 C6 72 E1 E3 3E 9A 8A 67 42 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 304 (0x000130) "<init>"
+    30 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 312 (0x000138) "I"
+    38 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 315 (0x00013b) "III"
+    3B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 320 (0x000140) "Ldot/junit/opcodes/if_le/d/T_if_le_12;"
+    40 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 360 (0x000168) "Ljava/lang/Object;"
+    68 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 380 (0x00017c) "T_if_le_12.java"
+    7C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "run"
+    90 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/if_le/d/T_if_le_12;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "III"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 296 (0x000128)
+    02 00 00 00 00 00 00 00 28 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_le/d/T_if_le_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_if_le_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 405 (0x000195)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 95 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_12.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_12.run"
+    // parsed: offset 264, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 266, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 7
+        07 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: if-le v6, v7, 0005 // +0x0005
+//@mod            37 76 05 00 
+            37 76 00 00 
+        // parsed: offset 284, len 4: |0002: const/16 v6, #int 1234 // #0x4d2
+            13 06 D2 04 
+        // parsed: offset 288, len 2: |0004: return v6
+            0F 06 
+        // parsed: offset 290, len 2: |0005: const/4 v6, #int 1 // #0x1
+            12 16 
+        // parsed: offset 292, len 2: |0006: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 296, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 300, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 302, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 304, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 312, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 315, len 5: TYPE_STRING_DATA_ITEM [2] "III"
+    03 49 49 49 00 
+// parsed: offset 320, len 40: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/if_le/d/T_if_le_12;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 2F 64 2F 54 5F 69 66 5F 6C 65 5F 31 32 3B 00 
+// parsed: offset 360, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 380, len 17: TYPE_STRING_DATA_ITEM [5] "T_if_le_12.java"
+    0F 54 5F 69 66 5F 6C 65 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_le/d/T_if_le_12;"
+    // parsed: offset 405, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 406, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 408, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 409, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 410, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 413, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 415, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 416, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 417, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 419, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 296 (0x000128)
+        01 10 00 00 01 00 00 00 28 01 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 304 (0x000130)
+        02 20 00 00 08 00 00 00 30 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 405 (0x000195)
+        00 20 00 00 01 00 00 00 95 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_3.d
new file mode 100644
index 0000000..e389992
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_3.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_le_3.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       if-le v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_4.d
new file mode 100644
index 0000000..514c26b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_4.d
@@ -0,0 +1,23 @@
+.source T_if_le_4.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-le v6, v8, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_5.d
new file mode 100644
index 0000000..a70e43f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_5.d
@@ -0,0 +1,23 @@
+.source T_if_le_5.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-le v5, v6, Label11
+       const/16 v5, 1234
+       return v5
+       
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_6.d
new file mode 100644
index 0000000..fb8bb3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_6.d
@@ -0,0 +1,23 @@
+.source T_if_le_6.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-le v5, v7, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_7.d
new file mode 100644
index 0000000..cf76654
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_7.d
@@ -0,0 +1,23 @@
+.source T_if_le_7.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;I)I
+.limit regs 8
+
+       if-le v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_8.d
new file mode 100644
index 0000000..34562f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_8.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_le_8.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-le v6, v0, Label11
+       const/16 v6, 1234
+       return v6
+       
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.d
new file mode 100644
index 0000000..99fa7c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.d
@@ -0,0 +1,23 @@
+.source T_if_le_9.java
+.class public dot.junit.opcodes.if_le.d.T_if_le_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-le v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh
new file mode 100644
index 0000000..51da483
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_le/d/T_if_le_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 9b4b41ee
+    EE 41 4B 9B 
+// parsed: offset 12, len 20: signature           : eaf2...5695
+    EA F2 77 CB B7 40 83 E4 FA CE 5D C9 DE E0 C3 20 0C 85 56 95 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_le/d/T_if_le_9;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_le_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "Z"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "ZII"
+    90 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_le/d/T_if_le_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_le/d/T_if_le_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_le_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_le.d.T_if_le_9.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-le v6, v7, 0004 // +0x0004
+//@mod      37 76 04 00 
+            37 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 39: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_le/d/T_if_le_9;"
+    25 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 2F 64 2F 54 5F 69 66 5F 6C 65 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 16: TYPE_STRING_DATA_ITEM [4] "T_if_le_9.java"
+    0E 54 5F 69 66 5F 6C 65 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_le/d/T_if_le_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/Test_if_lez.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/Test_if_lez.java
new file mode 100644
index 0000000..4f72938
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/Test_if_lez.java
@@ -0,0 +1,152 @@
+package dot.junit.opcodes.if_lez;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_lez.d.T_if_lez_1;
+import dot.junit.opcodes.if_lez.d.T_if_lez_2;
+
+public class Test_if_lez extends DxTestCase {
+
+    /**
+     * @title Argument = 5
+     */
+    public void testN1() {
+        T_if_lez_1 t = new T_if_lez_1();
+        assertEquals(1234, t.run(5));
+    }
+
+    /**
+     * @title Argument = -5
+     */
+    public void testN2() {
+        T_if_lez_1 t = new T_if_lez_1();
+        assertEquals(1, t.run(-5));
+    }
+
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_if_lez_2 t = new T_if_lez_2();
+        assertEquals(1, t.run(-1.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_lez_1 t = new T_if_lez_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_lez_1 t = new T_if_lez_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB3() {
+        T_if_lez_1 t = new T_if_lez_1();
+        assertEquals(1, t.run(0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title branch must not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lez.d.T_if_lez_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d
new file mode 100644
index 0000000..6429797
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d
@@ -0,0 +1,23 @@
+.source T_if_lez_1.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-lez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java
new file mode 100644
index 0000000..b3d7441
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_lez.d;
+
+public class T_if_lez_1 {
+
+    public int run(int a) {
+        return a <= 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d
new file mode 100644
index 0000000..82a8268
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d
@@ -0,0 +1,23 @@
+.source T_if_lez_10.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-lez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh
new file mode 100644
index 0000000..66ce09b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh
@@ -0,0 +1,274 @@
+// Processing '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_10.dex'...
+// Opened '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : ca1e4159
+    59 41 1E CA 
+// parsed: offset 12, len 20: signature           : 43ef...3a58
+    43 EF DB CD B8 45 E7 FA DE 03 53 F0 4C 14 8B A8 BE 13 3A 58 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_lez/d/T_if_lez_10;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_lez_10.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "Z"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "ZI"
+    93 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lez/d/T_if_lez_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lez/d/T_if_lez_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lez_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_10.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lez v5, 0004 // +0x0004
+//@mod      3D 05 04 00 
+            3D 05 00 00            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lez/d/T_if_lez_10;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 7A 2F 64 2F 54 5F 69 66 5F 6C 65 7A 5F 31 30 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_lez_10.java"
+    10 54 5F 69 66 5F 6C 65 7A 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 403, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lez/d/T_if_lez_10;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d
new file mode 100644
index 0000000..cbe7f34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d
@@ -0,0 +1,23 @@
+.source T_if_lez_2.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-lez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java
new file mode 100644
index 0000000..37ce198
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_lez.d;
+
+public class T_if_lez_2 {
+
+    public int run(float a) {
+        return a <= 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d
new file mode 100644
index 0000000..4efd27a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d
@@ -0,0 +1,23 @@
+.source T_if_lez_3.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-lez v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d
new file mode 100644
index 0000000..985254d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d
@@ -0,0 +1,23 @@
+.source T_if_lez_4.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 6
+
+       if-lez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d
new file mode 100644
index 0000000..705c855
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d
@@ -0,0 +1,23 @@
+.source T_if_lez_5.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-lez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d
new file mode 100644
index 0000000..596f1d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d
@@ -0,0 +1,23 @@
+.source T_if_lez_6.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-lez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d
new file mode 100644
index 0000000..129b4bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_lez_7.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-lez v0, Label9
+       const/16 v0, 1234
+       return v0
+
+Label9:
+       const/4 v0, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d
new file mode 100644
index 0000000..b21ab3e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d
@@ -0,0 +1,23 @@
+.source T_if_lez_8.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-lez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh
new file mode 100644
index 0000000..d1e27e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 65b03e79
+    79 3E B0 65 
+// parsed: offset 12, len 20: signature           : 3e9a...b229
+    3E 9A CC 34 9B 91 4F 6B 11 37 FE 19 56 10 75 54 A2 9B B2 29 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_lez/d/T_if_lez_8;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_lez_8.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lez/d/T_if_lez_8;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lez/d/T_if_lez_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lez_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_8.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lez v5, 0004 // +0x0004
+//@mod      3D 05 04 00 
+            3D 05 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lez/d/T_if_lez_8;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 7A 2F 64 2F 54 5F 69 66 5F 6C 65 7A 5F 38 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_lez_8.java"
+    0F 54 5F 69 66 5F 6C 65 7A 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lez/d/T_if_lez_8;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d
new file mode 100644
index 0000000..5efdeba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d
@@ -0,0 +1,24 @@
+.source T_if_lez_9.java
+.class public dot.junit.opcodes.if_lez.d.T_if_lez_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-lez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       const v5, 0
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh
new file mode 100644
index 0000000..4ea81be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_lez/d/T_if_lez_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 4845421a
+    1A 42 45 48 
+// parsed: offset 12, len 20: signature           : 9aec...318f
+    9A EC E7 D4 FF 76 22 57 6F 40 A8 ED 6A 91 9F 1B EF 80 31 8F 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_lez/d/T_if_lez_9;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 366 (0x00016e) "Ljava/lang/Object;"
+    6E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 386 (0x000182) "T_if_lez_9.java"
+    82 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 403 (0x000193) "V"
+    93 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 406 (0x000196) "Z"
+    96 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 409 (0x000199) "ZI"
+    99 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 413 (0x00019d) "run"
+    9D 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lez/d/T_if_lez_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lez/d/T_if_lez_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lez_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 418 (0x0001a2)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A2 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lez.d.T_if_lez_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lez v5, 0004 // +0x0004
+//@mod            3D 05 04 00 
+            3D 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 6: |0004: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lez/d/T_if_lez_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 65 7A 2F 64 2F 54 5F 69 66 5F 6C 65 7A 5F 39 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 386, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_lez_9.java"
+    0F 54 5F 69 66 5F 6C 65 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 403, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 406, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 409, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 413, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lez/d/T_if_lez_9;"
+    // parsed: offset 418, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 419, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 420, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 421, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 423, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 426, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 428, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 429, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 430, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 418 (0x0001a2)
+        00 20 00 00 01 00 00 00 A2 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/Test_if_lt.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/Test_if_lt.java
new file mode 100644
index 0000000..26a3faa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/Test_if_lt.java
@@ -0,0 +1,175 @@
+package dot.junit.opcodes.if_lt;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_lt.d.T_if_lt_1;
+import dot.junit.opcodes.if_lt.d.T_if_lt_11;
+
+public class Test_if_lt extends DxTestCase {
+
+    /**
+     * @title Case: 5 < 6
+     */
+    public void testN1() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1, t.run(5, 6));
+    }
+
+    /**
+     * @title Case: 0x0f0e0d0c = 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Case: 5 > -5
+     */
+    public void testN3() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(5, -5));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_if_lt_11 t = new T_if_lt_11();
+        assertEquals(1, t.run(1, 1f));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(0, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_if_lt_1 t = new T_if_lt_1();
+        assertEquals(1234, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a 
+     * @title branch target shall not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_lt.d.T_if_lt_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d
new file mode 100644
index 0000000..c81d8b3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_1.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-lt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java
new file mode 100644
index 0000000..5a2e8e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_lt.d;
+
+public class T_if_lt_1 {
+
+    public int run(int a, int b) {
+        return a < b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d
new file mode 100644
index 0000000..4821984
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d
@@ -0,0 +1,24 @@
+.source T_if_lt_10.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-lt v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       const v6, 0
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh
new file mode 100644
index 0000000..bb2ed5a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh
@@ -0,0 +1,280 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c726416b
+    6B 41 26 C7 
+// parsed: offset 12, len 20: signature           : 7db8...3ca9
+    7D B8 1E 21 EA 87 C8 52 ED CF 14 C9 4B F4 E9 12 D4 32 3C A9 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 316 (0x00013c) "<init>"
+    3C 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 324 (0x000144) "I"
+    44 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 327 (0x000147) "Ldot/junit/opcodes/if_lt/d/T_if_lt_10;"
+    47 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_lt_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 407 (0x000197) "Z"
+    97 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "ZII"
+    9A 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lt/d/T_if_lt_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lt/d/T_if_lt_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lt_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lt v6, v7, 0004 // +0x0004
+//@mod            34 76 04 00 
+            34 76 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 6: |0004: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 314, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 316, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 324, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 327, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lt/d/T_if_lt_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 2F 64 2F 54 5F 69 66 5F 6C 74 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_lt_10.java"
+    0F 54 5F 69 66 5F 6C 74 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 407, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lt/d/T_if_lt_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 316 (0x00013c)
+        02 20 00 00 09 00 00 00 3C 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d
new file mode 100644
index 0000000..7e80ecf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_11.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 8
+
+       if-lt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java
new file mode 100644
index 0000000..cc3323f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_lt.d;
+
+public class T_if_lt_11 {
+
+    public int run(int a, float b) {
+        return a < b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d
new file mode 100644
index 0000000..f9083cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d
@@ -0,0 +1,23 @@
+.source T_if_lt_12.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-lt v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh
new file mode 100644
index 0000000..aed0448
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh
@@ -0,0 +1,276 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_12.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 69884064
+    64 40 88 69 
+// parsed: offset 12, len 20: signature           : 48bf...a511
+    48 BF EF 03 CC F9 FF EF 11 EC 1C 2E E4 83 0B D9 37 34 A5 11 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_lt/d/T_if_lt_12;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_lt_12.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "Z"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 402 (0x000192) "ZII"
+    92 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lt/d/T_if_lt_12;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lt/d/T_if_lt_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lt_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_12.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_12.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lt v6, v7, 0004 // +0x0004
+//@mod            34 76 04 00 
+            34 76 00 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lt/d/T_if_lt_12;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 2F 64 2F 54 5F 69 66 5F 6C 74 5F 31 32 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_lt_12.java"
+    0F 54 5F 69 66 5F 6C 74 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 402, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lt/d/T_if_lt_12;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d
new file mode 100644
index 0000000..94546c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_if_icmpge_2.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       if-lt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java
new file mode 100644
index 0000000..14e148c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.if_lt.d;
+
+public class T_if_lt_2 {
+
+    public int run(float a, float b) {
+        return a < b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d
new file mode 100644
index 0000000..9a93ac6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_4.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-lt v6, v8, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d
new file mode 100644
index 0000000..7d77ad9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_5.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-lt v5, v6, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d
new file mode 100644
index 0000000..9d1910e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_6.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-lt v5, v7, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d
new file mode 100644
index 0000000..8d126c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d
@@ -0,0 +1,23 @@
+.source T_if_icmpge_7.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;I)I
+.limit regs 8
+
+       if-lt v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d
new file mode 100644
index 0000000..8c2f2ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d
@@ -0,0 +1,23 @@
+.source T_if_lt_9.java
+.class public dot.junit.opcodes.if_lt.d.T_if_lt_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-lt v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh
new file mode 100644
index 0000000..10b38ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_lt/d/T_if_lt_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : b45f4033
+    33 40 5F B4 
+// parsed: offset 12, len 20: signature           : 4cb8...7b33
+    4C B8 1D 60 D7 F6 8E D3 C9 42 C8 6B 13 3F AD C6 EB 57 7B 33 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_lt/d/T_if_lt_9;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_lt_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "Z"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 400 (0x000190) "ZII"
+    90 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_lt/d/T_if_lt_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_lt/d/T_if_lt_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_lt_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_lt.d.T_if_lt_9.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-lt v6, v7, 0004 // +0x0004
+//@mod      34 76 04 00 
+            34 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 39: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_lt/d/T_if_lt_9;"
+    25 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 2F 64 2F 54 5F 69 66 5F 6C 74 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 16: TYPE_STRING_DATA_ITEM [4] "T_if_lt_9.java"
+    0E 54 5F 69 66 5F 6C 74 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 400, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_lt/d/T_if_lt_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java
new file mode 100644
index 0000000..b70d16e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java
@@ -0,0 +1,150 @@
+package dot.junit.opcodes.if_ltz;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_ltz.d.T_if_ltz_1;
+import dot.junit.opcodes.if_ltz.d.T_if_ltz_2;
+
+public class Test_if_ltz extends DxTestCase {
+
+    /**
+     * @title Argument = 5
+     */
+    public void testN1() {
+        T_if_ltz_1 t = new T_if_ltz_1();
+        assertEquals(1234, t.run(5));
+    }
+
+    /**
+     * @title Argument = -5
+     */
+    public void testN2() {
+        T_if_ltz_1 t = new T_if_ltz_1();
+        assertEquals(1, t.run(-5));
+    }
+
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_if_ltz_2 t = new T_if_ltz_2();
+        assertEquals(1234, t.run(1.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_ltz_1 t = new T_if_ltz_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_ltz_1 t = new T_if_ltz_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB3() {
+        T_if_ltz_1 t = new T_if_ltz_1();
+        assertEquals(1234, t.run(0));
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title branch must not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ltz.d.T_if_ltz_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d
new file mode 100644
index 0000000..7022a90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_1.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-ltz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java
new file mode 100644
index 0000000..7e666cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ltz.d;
+
+public class T_if_ltz_1 {
+
+    public int run(int a) {
+        return a < 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d
new file mode 100644
index 0000000..aa01356
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_2.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-ltz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java
new file mode 100644
index 0000000..0c0480e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ltz.d;
+
+public class T_if_ltz_2 {
+
+    public int run(float a) {
+        return a < 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d
new file mode 100644
index 0000000..d2405ed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_3.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-ltz v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d
new file mode 100644
index 0000000..804ef88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_4.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 6
+
+       if-ltz v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d
new file mode 100644
index 0000000..af8e741
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_5.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-ltz v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d
new file mode 100644
index 0000000..c56730f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_6.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-ltz v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d
new file mode 100644
index 0000000..f14a551
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_7.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-ltz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh
new file mode 100644
index 0000000..afb4652
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh
@@ -0,0 +1,272 @@
+// Processing '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dex'...
+// Opened '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 7337400f
+    0F 40 37 73 
+// parsed: offset 12, len 20: signature           : 0250...bf7f
+    02 50 04 7A E3 17 74 3C 13 73 F6 D7 EA 11 9E F4 EC 4E BF 7F 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_7;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_ltz_7.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_7;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_7;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ltz_7.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_7.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_7.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ltz v5, 0004 // +0x0004
+//@mod      3A 05 04 00 
+            3A 05 00 00            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_7;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 7A 2F 64 2F 54 5F 69 66 5F 6C 74 7A 5F 37 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ltz_7.java"
+    0F 54 5F 69 66 5F 6C 74 7A 5F 37 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_7;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d
new file mode 100644
index 0000000..650e299
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d
@@ -0,0 +1,23 @@
+.source T_if_ltz_8.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-ltz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh
new file mode 100644
index 0000000..dc3b594
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 6a9b3f87
+    87 3F 9B 6A 
+// parsed: offset 12, len 20: signature           : 2cbc...44c1
+    2C BC B6 C9 37 D4 49 42 95 BD 36 89 BC B0 07 51 07 6A 44 C1 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_8;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_ltz_8.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_8;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ltz_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_8.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ltz v5, 0004 // +0x0004
+//@mod      3A 05 04 00 
+            3A 05 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_8;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 7A 2F 64 2F 54 5F 69 66 5F 6C 74 7A 5F 38 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ltz_8.java"
+    0F 54 5F 69 66 5F 6C 74 7A 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_8;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d
new file mode 100644
index 0000000..3b4a3dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d
@@ -0,0 +1,24 @@
+.source T_if_ltz_9.java
+.class public dot.junit.opcodes.if_ltz.d.T_if_ltz_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-ltz v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       const v5, 0
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh
new file mode 100644
index 0000000..dc5146c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 9e5c41e6
+    E6 41 5C 9E 
+// parsed: offset 12, len 20: signature           : c9e3...0f3f
+    C9 E3 71 AB 73 15 F5 E7 72 4D 3A A7 77 F4 E9 3F FF 4D 0F 3F 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_9;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 366 (0x00016e) "Ljava/lang/Object;"
+    6E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 386 (0x000182) "T_if_ltz_9.java"
+    82 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 403 (0x000193) "V"
+    93 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 406 (0x000196) "Z"
+    96 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 409 (0x000199) "ZI"
+    99 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 413 (0x00019d) "run"
+    9D 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ltz_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 418 (0x0001a2)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A2 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ltz.d.T_if_ltz_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ltz v5, 0004 // +0x0004
+//@mod            3A 05 04 00 
+            3A 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 6: |0004: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6C 74 7A 2F 64 2F 54 5F 69 66 5F 6C 74 7A 5F 39 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 386, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ltz_9.java"
+    0F 54 5F 69 66 5F 6C 74 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 403, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 406, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 409, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 413, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ltz/d/T_if_ltz_9;"
+    // parsed: offset 418, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 419, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 420, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 421, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 423, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 426, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 428, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 429, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 430, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 418 (0x0001a2)
+        00 20 00 00 01 00 00 00 A2 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/Test_if_ne.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/Test_if_ne.java
new file mode 100644
index 0000000..610fe96
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/Test_if_ne.java
@@ -0,0 +1,205 @@
+package dot.junit.opcodes.if_ne;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_ne.d.T_if_ne_1;
+import dot.junit.opcodes.if_ne.d.T_if_ne_2;
+import dot.junit.opcodes.if_ne.d.T_if_ne_4;
+
+public class Test_if_ne extends DxTestCase {
+
+    /**
+     * @title Arguments = 5, 6
+     */
+    public void testN1() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1, t.run(5, 6));
+    }
+
+    /**
+     * @title Arguments = 0x0f0e0d0c, 0x0f0e0d0c
+     */
+    public void testN2() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1234, t.run(0x0f0e0d0c, 0x0f0e0d0c));
+    }
+
+    /**
+     * @title Arguments = 5, -5
+     */
+    public void testN3() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1, t.run(5, -5));
+    }
+
+    /**
+     * @title Arguments = 0x01001234, 0x1234
+     */
+    public void testN4() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1, t.run(0x01001234, 0x1234));
+    }
+    
+    /**
+     * @title compare references
+     */
+    public void testN5() {
+        T_if_ne_2 t = new T_if_ne_2();
+        String a = "a";
+        String b = "b";
+        assertEquals(1, t.run(a, b));
+    }
+
+    /**
+     * @title compare references
+     */
+    public void testN6() {
+        T_if_ne_2 t = new T_if_ne_2();
+        String a = "a";
+        assertEquals(1234, t.run(a, a));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of int and float makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_if_ne_4 t = new T_if_ne_4();
+        assertEquals(1, t.run(1f, 1));
+    }  
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 1234567
+     */
+    public void testB3() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1, t.run(0, 1234567));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB4() {
+        T_if_ne_1 t = new T_if_ne_1();
+        assertEquals(1234, t.run(0, 0));
+    }
+    
+    /**
+     * @title Compare with null
+     */
+    public void testB5() {
+        T_if_ne_2 t = new T_if_ne_2();
+        String a = "a";
+        assertEquals(1, t.run(null, a));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title  branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a 
+     * @title branch target shall not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_ne.d.T_if_ne_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d
new file mode 100644
index 0000000..cb84784
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d
@@ -0,0 +1,23 @@
+.source T_if_ne_1.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ne v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java
new file mode 100644
index 0000000..ebc05ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ne.d;
+
+public class T_if_ne_1 {
+
+    public int run(int a, int b) {
+        return a != b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d
new file mode 100644
index 0000000..f42d830
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d
@@ -0,0 +1,23 @@
+.source T_if_ne_10.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-ne v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh
new file mode 100644
index 0000000..f5f9427
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 095c418d
+    8D 41 5C 09 
+// parsed: offset 12, len 20: signature           : c237...7d40
+    C2 37 DB 94 22 A2 D1 8C 42 64 8C F7 AF 4F F0 C2 C2 D3 7D 40 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_ne/d/T_if_ne_10;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_ne_10.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "Z"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 402 (0x000192) "ZII"
+    92 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ne/d/T_if_ne_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ne/d/T_if_ne_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ne_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_10.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ne v6, v7, 0004 // +0x0004
+//@mod      33 76 04 00 
+            33 76 04 01            
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ne/d/T_if_ne_10;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 2F 64 2F 54 5F 69 66 5F 6E 65 5F 31 30 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ne_10.java"
+    0F 54 5F 69 66 5F 6E 65 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 402, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ne/d/T_if_ne_10;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d
new file mode 100644
index 0000000..65bb0d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d
@@ -0,0 +1,24 @@
+.source T_if_ne_11.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-ne v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       const v6, 0
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh
new file mode 100644
index 0000000..8b5c5e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh
@@ -0,0 +1,280 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c3f03ff3
+    F3 3F F0 C3 
+// parsed: offset 12, len 20: signature           : 1786...89ee
+    17 86 0D 00 7F F4 86 BF 36 21 B8 93 62 57 3D EA B7 59 89 EE 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 316 (0x00013c) "<init>"
+    3C 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 324 (0x000144) "I"
+    44 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 327 (0x000147) "Ldot/junit/opcodes/if_ne/d/T_if_ne_11;"
+    47 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_ne_11.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 407 (0x000197) "Z"
+    97 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "ZII"
+    9A 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ne/d/T_if_ne_11;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ne/d/T_if_ne_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ne_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_11.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_11.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ne v6, v7, 0004 // +0x0004
+//@mod            33 76 04 00 
+            33 76 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 6: |0004: const v6, #float 0.000000 // #0x00000000 int
+            14 06 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 314, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 316, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 324, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 327, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ne/d/T_if_ne_11;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 2F 64 2F 54 5F 69 66 5F 6E 65 5F 31 31 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ne_11.java"
+    0F 54 5F 69 66 5F 6E 65 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 407, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ne/d/T_if_ne_11;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 316 (0x00013c)
+        02 20 00 00 09 00 00 00 3C 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d
new file mode 100644
index 0000000..0893fa4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d
@@ -0,0 +1,23 @@
+.source T_if_ne_12.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)Z
+.limit regs 8
+
+       if-ne v6, v7, Label10
+       const/4 v6, 0
+       return v6
+
+Label10:
+       nop
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh
new file mode 100644
index 0000000..e78249f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh
@@ -0,0 +1,276 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_12.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/if_ne/d/T_if_ne_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 37603d62
+    62 3D 60 37 
+// parsed: offset 12, len 20: signature           : 24e7...4311
+    24 E7 8D 35 83 34 1E 83 9C DE 27 13 02 76 B3 A3 53 37 43 11 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/if_ne/d/T_if_ne_12;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_ne_12.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "Z"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 402 (0x000192) "ZII"
+    92 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_ne/d/T_if_ne_12;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZII"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_ne/d/T_if_ne_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_ne_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_12.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_ne.d.T_if_ne_12.run"
+    // parsed: offset 272, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 274, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-ne v6, v7, 0004 // +0x0004
+//@mod            33 76 04 00 
+            33 76 00 00 
+        // parsed: offset 292, len 2: |0002: const/4 v6, #int 0 // #0x0
+            12 06 
+        // parsed: offset 294, len 2: |0003: return v6
+            0F 06 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v6
+            0F 06 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+    // parsed: offset 306, len 2: type_item [1] type_idx: 0
+        00 00 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 40: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_ne/d/T_if_ne_12;"
+    26 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 2F 64 2F 54 5F 69 66 5F 6E 65 5F 31 32 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_ne_12.java"
+    0F 54 5F 69 66 5F 6E 65 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 402, len 5: TYPE_STRING_DATA_ITEM [7] "ZII"
+    03 5A 49 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_ne/d/T_if_ne_12;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 308 (0x000134)
+        02 20 00 00 09 00 00 00 34 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d
new file mode 100644
index 0000000..039f954
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d
@@ -0,0 +1,23 @@
+.source T_if_ne_2.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;Ljava/lang/String;)I
+.limit regs 8
+
+       if-ne v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java
new file mode 100644
index 0000000..79c7519
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ne.d;
+
+public class T_if_ne_2 {
+
+    public int run(String a, String b) {
+        return a != b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d
new file mode 100644
index 0000000..aaa66e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d
@@ -0,0 +1,23 @@
+.source T_if_ne_4.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       if-ne v6, v7, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java
new file mode 100644
index 0000000..fbd1049
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_ne.d;
+
+public class T_if_ne_4 {
+
+    public int run(float a, int b) {
+        return a != b ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d
new file mode 100644
index 0000000..4bfefaa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d
@@ -0,0 +1,23 @@
+.source T_if_ne_5.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ne v6, v8, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d
new file mode 100644
index 0000000..5e57f66
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d
@@ -0,0 +1,23 @@
+.source T_if_ne_7.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       if-ne v5, v6, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d
new file mode 100644
index 0000000..0001b04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d
@@ -0,0 +1,23 @@
+.source T_if_ne_8.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       if-ne v5, v7, Label11
+       const/16 v5, 1234
+       return v5
+
+Label11:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d
new file mode 100644
index 0000000..4f3f107
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d
@@ -0,0 +1,23 @@
+.source T_if_ne_9.java
+.class public dot.junit.opcodes.if_ne.d.T_if_ne_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       if-ne v6, v5, Label11
+       const/16 v6, 1234
+       return v6
+
+Label11:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/Test_if_nez.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/Test_if_nez.java
new file mode 100644
index 0000000..1283f37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/Test_if_nez.java
@@ -0,0 +1,159 @@
+package dot.junit.opcodes.if_nez;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.if_nez.d.T_if_nez_1;
+import dot.junit.opcodes.if_nez.d.T_if_nez_2;
+import dot.junit.opcodes.if_nez.d.T_if_nez_3;
+import dot.junit.opcodes.if_nez.d.T_if_nez_4;
+
+public class Test_if_nez extends DxTestCase {
+    
+    /**
+     * @title Argument = 5 and -5
+     */
+    public void testN1() {
+        T_if_nez_1 t = new T_if_nez_1();
+        assertEquals(1, t.run(5));
+        assertEquals(1, t.run(-5));
+    }
+
+    /**
+     * @title Arguments = null
+     */
+    public void testN2() {
+        T_if_nez_2 t = new T_if_nez_2();
+        String str = null;
+        assertEquals(1234, t.run(str));
+    }
+    
+    /**
+     * @title Arguments = not null
+     */
+    public void testN3() {
+        T_if_nez_2 t = new T_if_nez_2();
+        String str = "abc";
+        assertEquals(1, t.run(str));
+    }
+    
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_if_nez_3 t = new T_if_nez_3();
+        assertEquals(1, t.run(3.123f));
+    }
+    
+    /**
+     * @title Arguments = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_if_nez_1 t = new T_if_nez_1();
+        assertEquals(1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_if_nez_1 t = new T_if_nez_1();
+        assertEquals(1, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 0
+     */
+    public void testB3() {
+        T_if_nez_1 t = new T_if_nez_1();
+        assertEquals(1234, t.run(0));
+    }
+    
+    /**
+     * @title Compare reference with null
+     */
+    public void testB4() {
+        T_if_nez_4 t = new T_if_nez_4();
+        assertEquals(1234, t.run(null));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+
+    /**
+     * @constraint A6 
+     * @title branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A6 
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title branch must not be 0
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.if_nez.d.T_if_nez_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d
new file mode 100644
index 0000000..da15ff2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d
@@ -0,0 +1,23 @@
+.source T_ifne_1.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-nez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java
new file mode 100644
index 0000000..7e8aab3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_nez.d;
+
+public class T_if_nez_1 {
+
+    public int run(int a) {
+        return a != 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d
new file mode 100644
index 0000000..4a5a9a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d
@@ -0,0 +1,24 @@
+.source T_if_nez_10.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-nez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       const v5, 0
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh
new file mode 100644
index 0000000..c690b98
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh
@@ -0,0 +1,278 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_10.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_10.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : f7d6442e
+    2E 44 D6 F7 
+// parsed: offset 12, len 20: signature           : b285...f2c1
+    B2 85 AD 8B CF 5D F1 BB 04 91 E9 46 C9 64 A2 AE E4 DA F2 C1 
+// parsed: offset 32, len 4: file_size           : 572
+    3C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 436 (0x0001b4)
+    B4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 314 (0x00013a) "<init>"
+    3A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 322 (0x000142) "I"
+    42 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 325 (0x000145) "Ldot/junit/opcodes/if_nez/d/T_if_nez_10;"
+    45 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 367 (0x00016f) "Ljava/lang/Object;"
+    6F 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 387 (0x000183) "T_if_nez_10.java"
+    83 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 405 (0x000195) "V"
+    95 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 408 (0x000198) "Z"
+    98 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 411 (0x00019b) "ZI"
+    9B 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 415 (0x00019f) "run"
+    9F 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_nez/d/T_if_nez_10;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 308 (0x000134)
+    07 00 00 00 04 00 00 00 34 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_nez/d/T_if_nez_10;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_nez_10.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 420 (0x0001a4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 A4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_10.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_10.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 9
+        09 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-nez v5, 0004 // +0x0004
+//@mod            39 05 04 00 
+            39 05 05 00 
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 6: |0004: const v5, #float 0.000000 // #0x00000000 int
+            14 05 00 00 00 00 
+        // parsed: offset 302, len 2: |0007: nop // spacer
+            00 00 
+        // parsed: offset 304, len 2: |0008: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// parsed: offset 306, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 308, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 312, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 314, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 322, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 325, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_nez/d/T_if_nez_10;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 7A 2F 64 2F 54 5F 69 66 5F 6E 65 7A 5F 31 30 3B 00 
+// parsed: offset 367, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 387, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_nez_10.java"
+    10 54 5F 69 66 5F 6E 65 7A 5F 31 30 2E 6A 61 76 61 00 
+// parsed: offset 405, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 408, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 411, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 415, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_nez/d/T_if_nez_10;"
+    // parsed: offset 420, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 421, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 422, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 423, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 424, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 425, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 428, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 430, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 431, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 432, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 434, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 436, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 440, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 452, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 464, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 476, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 488, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 308 (0x000134)
+        01 10 00 00 01 00 00 00 34 01 00 00 
+    // parsed: offset 536, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 314 (0x00013a)
+        02 20 00 00 09 00 00 00 3A 01 00 00 
+    // parsed: offset 548, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 20 00 00 01 00 00 00 A4 01 00 00 
+    // parsed: offset 560, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 436 (0x0001b4)
+        00 10 00 00 01 00 00 00 B4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d
new file mode 100644
index 0000000..81ef2ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d
@@ -0,0 +1,23 @@
+.source T_if_nez_11.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-nez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh
new file mode 100644
index 0000000..07373f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh
@@ -0,0 +1,274 @@
+// Processing '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_11.dex'...
+// Opened '/home/julia/workspace/dalvikNew/out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a76043b4
+    B4 43 60 A7 
+// parsed: offset 12, len 20: signature           : 1a2c...f8f3
+    1A 2C DB A0 C2 B5 CC A7 79 C0 8C CA A6 EE F6 C4 35 81 F8 F3 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_nez/d/T_if_nez_11;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 359 (0x000167) "Ljava/lang/Object;"
+    67 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 379 (0x00017b) "T_if_nez_11.java"
+    7B 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "Z"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "ZI"
+    93 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 407 (0x000197) "run"
+    97 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_nez/d/T_if_nez_11;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_nez/d/T_if_nez_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_nez_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 412 (0x00019c)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9C 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_11.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_11.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-nez v5, 0004 // +0x0004
+//@mod      39 05 04 00 
+            39 05 00 00            
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 42: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_nez/d/T_if_nez_11;"
+    28 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 7A 2F 64 2F 54 5F 69 66 5F 6E 65 7A 5F 31 31 3B 00 
+// parsed: offset 359, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 379, len 18: TYPE_STRING_DATA_ITEM [4] "T_if_nez_11.java"
+    10 54 5F 69 66 5F 6E 65 7A 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 403, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 407, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_nez/d/T_if_nez_11;"
+    // parsed: offset 412, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 413, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 414, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 415, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 20 00 00 01 00 00 00 9C 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d
new file mode 100644
index 0000000..d95004a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d
@@ -0,0 +1,23 @@
+.source T_ifne_2.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/String;)I
+.limit regs 6
+
+       if-nez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java
new file mode 100644
index 0000000..802b021
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_nez.d;
+
+public class T_if_nez_2 {
+
+    public int run(String o) {
+        return o != null ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d
new file mode 100644
index 0000000..ea90b8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d
@@ -0,0 +1,23 @@
+.source T_ifne_3.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 6
+
+       if-nez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java
new file mode 100644
index 0000000..149b181
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_nez.d;
+
+public class T_if_nez_3 {
+
+    public int run(float a) {
+        return a != 0 ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d
new file mode 100644
index 0000000..efe46b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d
@@ -0,0 +1,23 @@
+.source T_ifne_4.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)I
+.limit regs 6
+
+       if-nez v5, Label9
+       const/16 v5, 1234
+       return v5
+
+Label9:
+       const/4 v5, 1
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java
new file mode 100644
index 0000000..96b98a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.if_nez.d;
+
+public class T_if_nez_4 {
+
+    public int run(Object o) {
+        return o != null ? 1 : 1234;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d
new file mode 100644
index 0000000..8640ec1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d
@@ -0,0 +1,23 @@
+.source T_ifne_5.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 6
+
+       if-nez v6, Label9
+       const/16 v6, 1234
+       return v6
+
+Label9:
+       const/4 v6, 1
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d
new file mode 100644
index 0000000..67348ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d
@@ -0,0 +1,23 @@
+.source T_ifne_6.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 6
+
+       if-nez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d
new file mode 100644
index 0000000..b22102e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d
@@ -0,0 +1,23 @@
+.source T_ifne_7.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 6
+
+       if-nez v4, Label9
+       const/16 v4, 1234
+       return v4
+
+Label9:
+       const/4 v4, 1
+       return v4
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d
new file mode 100644
index 0000000..5ea760a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d
@@ -0,0 +1,23 @@
+.source T_if_nez_9.java
+.class public dot.junit.opcodes.if_nez.d.T_if_nez_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 6
+
+       if-nez v5, Label8
+       const/4 v5, 0
+       return v5
+
+Label8:
+       nop
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh
new file mode 100644
index 0000000..acd19bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/if_nez/d/T_if_nez_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 533b414c
+    4C 41 3B 53 
+// parsed: offset 12, len 20: signature           : a2dd...7edb
+    A2 DD 9C 8A FB 23 5C 93 89 55 98 BF E0 6A 76 51 CB 17 7E DB 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 306 (0x000132) "<init>"
+    32 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 314 (0x00013a) "I"
+    3A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/if_nez/d/T_if_nez_9;"
+    3D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 358 (0x000166) "Ljava/lang/Object;"
+    66 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 378 (0x00017a) "T_if_nez_9.java"
+    7A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "V"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "Z"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "ZI"
+    91 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 405 (0x000195) "run"
+    95 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/if_nez/d/T_if_nez_9;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 6 (0x000006) "Z"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 7 (0x000007) "ZI"
+//     return_type_idx: 4 (0x000004) "Z"
+//     parameters_off: 300 (0x00012c)
+    07 00 00 00 04 00 00 00 2C 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/if_nez/d/T_if_nez_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_if_nez_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_9.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.if_nez.d.T_if_nez_9.run"
+    // parsed: offset 272, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: if-nez v5, 0004 // +0x0004
+//@mod      39 05 04 00 
+            39 05 04 01
+        // parsed: offset 292, len 2: |0002: const/4 v5, #int 0 // #0x0
+            12 05 
+        // parsed: offset 294, len 2: |0003: return v5
+            0F 05 
+        // parsed: offset 296, len 2: |0004: nop // spacer
+            00 00 
+        // parsed: offset 298, len 2: |0005: return v5
+            0F 05 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 300, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 304, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 306, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 314, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 317, len 41: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/if_nez/d/T_if_nez_9;"
+    27 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 66 5F 6E 65 7A 2F 64 2F 54 5F 69 66 5F 6E 65 7A 5F 39 3B 00 
+// parsed: offset 358, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 378, len 17: TYPE_STRING_DATA_ITEM [4] "T_if_nez_9.java"
+    0F 54 5F 69 66 5F 6E 65 7A 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 398, len 3: TYPE_STRING_DATA_ITEM [6] "Z"
+    01 5A 00 
+// parsed: offset 401, len 4: TYPE_STRING_DATA_ITEM [7] "ZI"
+    02 5A 49 00 
+// parsed: offset 405, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/if_nez/d/T_if_nez_9;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 272 (0x000110)
+                90 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 300 (0x00012c)
+        01 10 00 00 01 00 00 00 2C 01 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 306 (0x000132)
+        02 20 00 00 09 00 00 00 32 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/TestStubs.java
new file mode 100644
index 0000000..07bb886
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget;
+
+public class TestStubs {
+    // used by testVFE4
+    private int TestStubField = 50;
+    // ussed by testVFE15
+    protected int TestStubProtectedField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/Test_iget.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/Test_iget.java
new file mode 100644
index 0000000..50658ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/Test_iget.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget.d.T_iget_1;
+import dot.junit.opcodes.iget.d.T_iget_11;
+import dot.junit.opcodes.iget.d.T_iget_12;
+import dot.junit.opcodes.iget.d.T_iget_13;
+import dot.junit.opcodes.iget.d.T_iget_2;
+import dot.junit.opcodes.iget.d.T_iget_21;
+import dot.junit.opcodes.iget.d.T_iget_5;
+import dot.junit.opcodes.iget.d.T_iget_6;
+import dot.junit.opcodes.iget.d.T_iget_7;
+import dot.junit.opcodes.iget.d.T_iget_8;
+import dot.junit.opcodes.iget.d.T_iget_9;
+
+public class Test_iget extends DxTestCase {
+    
+    /**
+     * @title type - int
+     */
+    public void testN1() {
+        T_iget_1 t = new T_iget_1();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title type - float
+     */
+    public void testN2() {
+        T_iget_2 t = new T_iget_2();
+        assertEquals(123f, t.run());
+    }
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget.d.T_iget_1
+        //@uses dot.junit.opcodes.iget.d.T_iget_11
+        T_iget_11 t = new T_iget_11();
+        assertEquals(10, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_9 t = new T_iget_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B13 
+     * @title read integer from long field - only field with same name but 
+     * different type exist
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible private field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget.d.T_iget_6
+        //@uses dot.junit.opcodes.iget.TestStubs
+        try {
+            new T_iget_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget.d.T_iget_12
+        //@uses dot.junit.opcodes.iget.d.T_iget_1
+        try {
+            new T_iget_12().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for boolean fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read protected field of unrelated class.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget.d.T_iget_21
+        //@uses dot.junit.opcodes.iget.TestStubs
+        try {
+            new T_iget_21().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint A11
+     * @title Attempt to read static field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget.d.T_iget_5
+        //@uses dot.junit.opcodes.iget.TestStubs
+        try {
+            new T_iget_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget.d.T_iget_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.d
new file mode 100644
index 0000000..cac6528
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_1.java
+.class public dot.junit.opcodes.iget.d.T_iget_1
+.super java/lang/Object
+
+.field public  i1 I
+.field protected  p1 I
+.field private  pvt1 I
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const/4 v0, 5
+       iput v0, v1, dot.junit.opcodes.iget.d.T_iget_1.i1 I
+
+       const/16 v0, 10
+       iput v0, v1, dot.junit.opcodes.iget.d.T_iget_1.p1 I
+
+       const/16 v0, 20
+       iput v0, v1, dot.junit.opcodes.iget.d.T_iget_1.pvt1 I
+       
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_1.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.java
new file mode 100644
index 0000000..1ce655a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_1 {
+    public  int i1 = 5;
+    protected  int p1 = 10;
+    private  int pvt1 = 20;
+    
+    public int run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.d
new file mode 100644
index 0000000..6e64e3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_11.java
+.class public dot.junit.opcodes.iget.d.T_iget_11
+.super dot/junit/opcodes/iget/d/T_iget_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget/d/T_iget_1/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_1.p1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.java
new file mode 100644
index 0000000..9d6b376
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_11 extends T_iget_1 {
+
+    public int run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.d
new file mode 100644
index 0000000..312dd9c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_12.java
+.class public dot.junit.opcodes.iget.d.T_iget_12
+.super dot/junit/opcodes/iget/d/T_iget_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget/d/T_iget_1/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_1.pvt1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.java
new file mode 100644
index 0000000..b9f40ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_12 extends T_iget_1 {
+
+    @Override
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.d
new file mode 100644
index 0000000..eed73b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_13.java
+.class public dot.junit.opcodes.iget.d.T_iget_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_13.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.java
new file mode 100644
index 0000000..1038f56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_13 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_14.d
new file mode 100644
index 0000000..faa6271
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_14.java
+.class public dot.junit.opcodes.iget.d.T_iget_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_15.d
new file mode 100644
index 0000000..d50305b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_15.java
+.class public dot.junit.opcodes.iget.d.T_iget_15
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_16.d
new file mode 100644
index 0000000..8a5253b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_16.java
+.class public dot.junit.opcodes.iget.d.T_iget_16
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_16.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_17.d
new file mode 100644
index 0000000..69d1af4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_17.java
+.class public dot.junit.opcodes.iget.d.T_iget_17
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_18.d
new file mode 100644
index 0000000..c081e55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_18.java
+.class public dot.junit.opcodes.iget.d.T_iget_18
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_19.d
new file mode 100644
index 0000000..a555e94
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_19.java
+.class public dot.junit.opcodes.iget.d.T_iget_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.d
new file mode 100644
index 0000000..bf07640
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_2.java
+.class public dot.junit.opcodes.iget.d.T_iget_2
+.super java/lang/Object
+
+.field public  val F
+
+.method  <clinit>()V
+.limit regs 2
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const v0, 123.0
+       iput v0, v1, dot.junit.opcodes.iget.d.T_iget_2.val F
+       
+       return-void
+.end method
+
+.method public run()F
+.limit regs 4
+
+       iget v1, v3, dot.junit.opcodes.iget.d.T_iget_2.val F
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.java
new file mode 100644
index 0000000..3efa19d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_2 {
+
+    public  float val = 123.0f;
+    
+    public float run() {
+        return val;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_20.d
new file mode 100644
index 0000000..b34faae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_20.java
+.class public dot.junit.opcodes.iget.d.T_iget_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v0, v2, dot.junit.opcodes.iget.d.T_iget_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.d
new file mode 100644
index 0000000..569458b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_21.java
+.class public dot.junit.opcodes.iget.d.T_iget_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget/TestStubs/<init>()V
+
+       iget v1, v0, dot.junit.opcodes.iget.TestStubs.TestStubProtectedField I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.java
new file mode 100644
index 0000000..31db5f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_21 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_3.d
new file mode 100644
index 0000000..f362d0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_3.java
+.class public dot.junit.opcodes.iget.d.T_iget_3
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget v3, v2, dot.junit.opcodes.iget.d.T_iget_3.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_30.d
new file mode 100644
index 0000000..3564c81
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_30.java
+.class public dot.junit.opcodes.iget.d.T_iget_30
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget/d/T_iget_30
+    iget v1, v0, dot.junit.opcodes.iget.d.T_iget_30.st_i1 I
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.d
new file mode 100644
index 0000000..8336a2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_4.java
+.class public dot.junit.opcodes.iget.d.T_iget_4
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_4.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.dfh
new file mode 100644
index 0000000..c29f935
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget/d/T_iget_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget/d/T_iget_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 385d3b6c
+    6C 3B 5D 38 
+// parsed: offset 12, len 20: signature           : bbc1...00f4
+    BB C1 79 16 63 A5 BB 13 9D 24 11 CB 85 1F A6 17 C0 39 00 F4 
+// parsed: offset 32, len 4: file_size           : 544
+    20 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 408 (0x000198)
+    98 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 296
+    28 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "I"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/iget/d/T_iget_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 344 (0x000158) "Ljava/lang/Object;"
+    58 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 364 (0x00016c) "T_iget_4.java"
+    6C 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 379 (0x00017b) "V"
+    7B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 382 (0x00017e) "i1"
+    7E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 386 (0x000182) "run"
+    82 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iget/d/T_iget_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iget/d/T_iget_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 391 (0x000187)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 87 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget.d.T_iget_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget.d.T_iget_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget v1, v2, Ldot/junit/opcodes/iget/d/T_iget_4;.i1:I // field@0000
+//@mod            52 21 00 00 
+            52 21 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 307, len 37: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iget/d/T_iget_4;"
+    23 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 2F 64 2F 54 5F 69 67 65 74 5F 34 3B 00 
+// parsed: offset 344, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 364, len 15: TYPE_STRING_DATA_ITEM [4] "T_iget_4.java"
+    0D 54 5F 69 67 65 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 379, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 382, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 386, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget/d/T_iget_4;"
+    // parsed: offset 391, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 392, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 393, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 394, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 395, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 396, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 397, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 398, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 401, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 403, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 404, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 405, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 407, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 408, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 412, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 424, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 436, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 448, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 460, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 472, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 484, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 496, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 508, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 520, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 391 (0x000187)
+        00 20 00 00 01 00 00 00 87 01 00 00 
+    // parsed: offset 532, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 10 00 00 01 00 00 00 98 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.d
new file mode 100644
index 0000000..7a7c3ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_5.java
+.class public dot.junit.opcodes.iget.d.T_iget_5
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_5.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.java
new file mode 100644
index 0000000..053f013
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_5 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.d
new file mode 100644
index 0000000..8ea70c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_6.java
+.class public dot.junit.opcodes.iget.d.T_iget_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget/TestStubs/<init>()V
+
+       iget v1, v0, dot.junit.opcodes.iget.TestStubs.TestStubField I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.java
new file mode 100644
index 0000000..efb61d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_6 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.d
new file mode 100644
index 0000000..a68b0f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_7.java
+.class public dot.junit.opcodes.iget.d.T_iget_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_7no_class.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.java
new file mode 100644
index 0000000..54b848f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_7 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.d
new file mode 100644
index 0000000..9fc3b75
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_8.java
+.class public dot.junit.opcodes.iget.d.T_iget_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       iget v1, v2, dot.junit.opcodes.iget.d.T_iget_8.i1N I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.java
new file mode 100644
index 0000000..249b4d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_8 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.d
new file mode 100644
index 0000000..268398c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_9.java
+.class public dot.junit.opcodes.iget.d.T_iget_9
+.super java/lang/Object
+
+.field public  val F
+
+.method  <clinit>()V
+.limit regs 2
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()F
+.limit regs 4
+
+       const v0, 0
+       iget v1, v0, dot.junit.opcodes.iget.d.T_iget_9.val F
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.java
new file mode 100644
index 0000000..440ad6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget/d/T_iget_9.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget.d;
+
+public class T_iget_9 {
+
+    public  float val = 123.0f;
+    
+    public float run() {
+        return val;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/TestStubs.java
new file mode 100644
index 0000000..8dcd427
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_boolean;
+
+public class TestStubs {
+    // used by testVFE4
+    private boolean TestStubField = true;
+    // used by testVFE15
+    protected boolean TestStubProtectedField = true;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java
new file mode 100644
index 0000000..b23f330
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_11;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_12;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_13;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_21;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_5;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_6;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_7;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_8;
+import dot.junit.opcodes.iget_boolean.d.T_iget_boolean_9;
+
+public class Test_iget_boolean extends DxTestCase {
+    
+    /**
+     * @title get boolean from field 
+     */
+    public void testN1() {
+        T_iget_boolean_1 t = new T_iget_boolean_1();
+        assertEquals(true, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_11
+        T_iget_boolean_11 t = new T_iget_boolean_11();
+        assertEquals(true, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_boolean_9 t = new T_iget_boolean_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+   
+
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B13 
+     * @title read boolean from long field - only field with same name but 
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_boolean_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_6
+        //@uses dot.junit.opcodes.iget_boolean.TestStubs
+        try {
+            new T_iget_boolean_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_boolean_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_boolean_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_12
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1
+        try {
+            new T_iget_boolean_12().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_boolean shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * @constraint B1 
+     * @title iget_boolean shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_21
+        //@uses dot.junit.opcodes.iget_boolean.TestStubs
+        try {
+            new T_iget_boolean_21().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_boolean.d.T_iget_boolean_5
+        //@uses dot.junit.opcodes.iget_boolean.TestStubs
+        try {
+            new T_iget_boolean_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_boolean.d.T_iget_boolean_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d
new file mode 100644
index 0000000..23b0a93
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_1.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1
+.super java/lang/Object
+
+.field public  i1 Z
+.field protected  p1 Z
+.field private  pvt1 Z
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const/4 v0, 1
+       iput-boolean v0, v1, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.i1 Z
+
+       const/16 v0, 1
+       iput-boolean v0, v1, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.p1 Z
+
+       const/16 v0, 1
+       iput-boolean v0, v1, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.pvt1 Z
+       
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java
new file mode 100644
index 0000000..b23b780
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_1 {
+    public boolean i1 = true;
+    protected boolean p1 = true;
+    private boolean pvt1 = true;
+    
+    public boolean run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d
new file mode 100644
index 0000000..540ecc5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_11.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_11
+.super dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.p1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java
new file mode 100644
index 0000000..2b2423e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_11 extends T_iget_boolean_1 {
+
+    public boolean run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d
new file mode 100644
index 0000000..e0a918f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_12.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_12
+.super dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_1.pvt1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java
new file mode 100644
index 0000000..5af996f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_12 extends T_iget_boolean_1 {
+
+    @Override
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d
new file mode 100644
index 0000000..50ad238
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_13.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_13.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java
new file mode 100644
index 0000000..b652090
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_13 {
+
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d
new file mode 100644
index 0000000..38a56f6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_14.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d
new file mode 100644
index 0000000..9b165d9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_15.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_15
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d
new file mode 100644
index 0000000..8eb7f27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_16.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_16
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d
new file mode 100644
index 0000000..499c796
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_17.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_17
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d
new file mode 100644
index 0000000..ab97074
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_18.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_18
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d
new file mode 100644
index 0000000..2909f36
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_19.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d
new file mode 100644
index 0000000..e37f360
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_20.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v0, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d
new file mode 100644
index 0000000..c59f39d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_21.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_boolean/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_boolean/TestStubs/<init>()V
+
+       iget-boolean v1, v0, dot.junit.opcodes.iget_boolean.TestStubs.TestStubProtectedField Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java
new file mode 100644
index 0000000..74e2da1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_21 {
+
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d
new file mode 100644
index 0000000..7b6f6f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_3.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_3
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-boolean v3, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_3.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d
new file mode 100644
index 0000000..9f30d4d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_30.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_30
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30
+    iget-boolean v1, v0, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_30.st_i1 Z
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d
new file mode 100644
index 0000000..56747b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_4.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_4
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_4.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh
new file mode 100644
index 0000000..a68f88b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 663a47b7
+    B7 47 3A 66 
+// parsed: offset 12, len 20: signature           : 26ba...8627
+    26 BA 95 8C 7D 61 05 BB C8 CD CB 51 38 D9 12 D7 C7 20 86 27 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "Ljava/lang/Object;"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 377 (0x000179) "T_iget_boolean_4.java"
+    79 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 400 (0x000190) "V"
+    90 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 403 (0x000193) "Z"
+    93 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 406 (0x000196) "i1"
+    96 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "run"
+    9A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "Z"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  type_idx: 3 (0x000003) name_idx: 6 (0x000006) "i1"
+    00 00 03 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_iget_boolean_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 415 (0x00019f)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 9F 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_boolean.d.T_iget_boolean_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_boolean.d.T_iget_boolean_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget-boolean v1, v2, Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;.i1:Z // field@0000
+//@mod            55 21 00 00 
+            55 21 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 53: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 62 6F 6F 6C 65 61 6E 2F 64 2F 54 5F 69 67 65 74 5F 62 6F 6F 6C 65 61 6E 5F 34 3B 00 
+// parsed: offset 357, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 377, len 23: TYPE_STRING_DATA_ITEM [3] "T_iget_boolean_4.java"
+    15 54 5F 69 67 65 74 5F 62 6F 6F 6C 65 61 6E 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 403, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 406, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_boolean/d/T_iget_boolean_4;"
+    // parsed: offset 415, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 416, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 417, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 418, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 419, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 420, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 421, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 422, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 425, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 427, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 428, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 429, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 431, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 415 (0x00019f)
+        00 20 00 00 01 00 00 00 9F 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d
new file mode 100644
index 0000000..f9bf929
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_5.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_5
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_5.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java
new file mode 100644
index 0000000..5b275aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_5 {
+
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d
new file mode 100644
index 0000000..ae3a118
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_6.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_boolean/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_boolean/TestStubs/<init>()V
+
+       iget-boolean v1, v0, dot.junit.opcodes.iget_boolean.TestStubs.TestStubField Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java
new file mode 100644
index 0000000..0d91cab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_6 {
+
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d
new file mode 100644
index 0000000..cdec059
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_7.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_7no_class.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java
new file mode 100644
index 0000000..3ec333b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_7 {
+
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d
new file mode 100644
index 0000000..fd4ff0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_8.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       iget-boolean v1, v2, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_8.i1N Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java
new file mode 100644
index 0000000..b87cf8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_8 {
+
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d
new file mode 100644
index 0000000..9b2b565
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_boolean_9.java
+.class public dot.junit.opcodes.iget_boolean.d.T_iget_boolean_9
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       const v0, 0        
+       iget-boolean v1, v0, dot.junit.opcodes.iget_boolean.d.T_iget_boolean_9.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java
new file mode 100644
index 0000000..a5261bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_boolean.d;
+
+public class T_iget_boolean_9 {
+    
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/TestStubs.java
new file mode 100644
index 0000000..90b1f13
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_byte;
+
+public class TestStubs {
+    // used by testVFE4
+    private byte TestStubField = 50;
+    // ussed by testVFE15
+    protected byte TestStubProtectedField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java
new file mode 100644
index 0000000..de48192
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_1;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_11;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_12;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_13;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_21;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_5;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_6;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_7;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_8;
+import dot.junit.opcodes.iget_byte.d.T_iget_byte_9;
+
+public class Test_iget_byte extends DxTestCase {
+    
+    /**
+     * @title get byte from field 
+     */
+    public void testN1() {
+        T_iget_byte_1 t = new T_iget_byte_1();
+        assertEquals(77, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_1
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_11
+        T_iget_byte_11 t = new T_iget_byte_11();
+        assertEquals(77, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_byte_9 t = new T_iget_byte_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }   
+
+    /**
+     * @constraint A11 
+     * @title  constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B13 
+     * @title read byte from long field - only field with same name but 
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_byte_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_6
+        //@uses dot.junit.opcodes.iget_byte.TestStubs
+        try {
+            new T_iget_byte_6().run();
+            fail("expected an IllegalAccessError exception");
+        }  catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_byte_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_byte_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_12
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_1
+        try {
+            new T_iget_byte_12().run();
+            fail("expected an IllegalAccessError exception");
+        }  catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * @constraint B1 
+     * @title iget_byte shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_21
+        //@uses dot.junit.opcodes.iget_byte.TestStubs
+        try {
+            new T_iget_byte_21().run();
+            fail("expected an IllegalAccessError exception");
+        }  catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static  field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_byte.d.T_iget_byte_5
+        //@uses dot.junit.opcodes.iget_byte.TestStubs        
+        try {
+            new T_iget_byte_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        }  catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_byte.d.T_iget_byte_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d
new file mode 100644
index 0000000..6dbe256
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_1.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_1
+.super java/lang/Object
+
+.field public  i1 B
+.field protected  p1 B
+.field private  pvt1 B
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const v0, 77
+       iput-byte v0, v1, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.i1 B
+
+       const v0, 77
+       iput-byte v0, v1, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.p1 B
+
+       const v0, 77
+       iput-byte v0, v1, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.pvt1 B
+       
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java
new file mode 100644
index 0000000..32df19e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_1 {
+    public static byte i1 = 77;
+    protected static byte p1 = 77;
+    private static byte pvt1 = 77;
+    
+    public byte run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d
new file mode 100644
index 0000000..0a13a63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_11.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_11
+.super dot/junit/opcodes/iget_byte/d/T_iget_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_byte/d/T_iget_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.p1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java
new file mode 100644
index 0000000..535c971
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_11 extends T_iget_byte_1 {
+
+    public byte run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d
new file mode 100644
index 0000000..19d218b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_12.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_12
+.super dot/junit/opcodes/iget_byte/d/T_iget_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_byte/d/T_iget_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_1.pvt1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java
new file mode 100644
index 0000000..3927a5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_12  extends T_iget_byte_1 {
+
+    @Override
+    public byte run() {
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d
new file mode 100644
index 0000000..f09be61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_13.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_13.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java
new file mode 100644
index 0000000..755b896
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_13  {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d
new file mode 100644
index 0000000..f33ce5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_14.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d
new file mode 100644
index 0000000..4564d6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_15.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_15
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d
new file mode 100644
index 0000000..0cd45ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_16.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_16
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d
new file mode 100644
index 0000000..fba56a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_17.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_17
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d
new file mode 100644
index 0000000..309001d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_18.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_18
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d
new file mode 100644
index 0000000..a1397ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_19.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d
new file mode 100644
index 0000000..2373e00
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_20.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v0, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d
new file mode 100644
index 0000000..40685ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_21.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_byte/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_byte/TestStubs/<init>()V
+
+       iget-byte v1, v0, dot.junit.opcodes.iget_byte.TestStubs.TestStubProtectedField B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java
new file mode 100644
index 0000000..10deb39
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_21 {
+
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d
new file mode 100644
index 0000000..a7cf811
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_3.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_3
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-byte v3, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_3.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d
new file mode 100644
index 0000000..1c8e463
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_30.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_30
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_byte/d/T_iget_byte_30
+    iget-byte v1, v0, dot.junit.opcodes.iget_byte.d.T_iget_byte_30.st_i1 B
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d
new file mode 100644
index 0000000..20f03c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_4.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_4
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_4.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh
new file mode 100644
index 0000000..26864a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : acfa42dd
+    DD 42 FA AC 
+// parsed: offset 12, len 20: signature           : 3689...2216
+    36 89 53 31 46 F7 82 E5 1D 14 90 9F A4 DE 9A 22 E0 BC 22 16 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "B"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_iget_byte_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "B"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "B"
+//     return_type_idx: 0 (0x000000) "B"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_byte_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_byte.d.T_iget_byte_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_byte.d.T_iget_byte_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget-byte v1, v2, Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;.i1:B // field@0000
+//@mod            56 21 00 00 
+            56 21 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "B"
+    01 42 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 62 79 74 65 2F 64 2F 54 5F 69 67 65 74 5F 62 79 74 65 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_iget_byte_4.java"
+    12 54 5F 69 67 65 74 5F 62 79 74 65 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_byte/d/T_iget_byte_4;"
+    // parsed: offset 406, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d
new file mode 100644
index 0000000..65e6ed0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_5.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_5
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_5.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java
new file mode 100644
index 0000000..75f7a5c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_5 {
+
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d
new file mode 100644
index 0000000..0f761e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_6.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_byte/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_byte/TestStubs/<init>()V
+
+       iget-byte v1, v0, dot.junit.opcodes.iget_byte.TestStubs.TestStubField B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java
new file mode 100644
index 0000000..20af80f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_6  {
+
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d
new file mode 100644
index 0000000..a9df70b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_7.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_7no_class.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java
new file mode 100644
index 0000000..f13071d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_7  {
+
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d
new file mode 100644
index 0000000..de3b7a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_8.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       iget-byte v1, v2, dot.junit.opcodes.iget_byte.d.T_iget_byte_8.i1N B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java
new file mode 100644
index 0000000..6f89bf3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_8  {
+
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d
new file mode 100644
index 0000000..96eee86
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_byte_9.java
+.class public dot.junit.opcodes.iget_byte.d.T_iget_byte_9
+.super java/lang/Object
+
+.field public i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       const v0, 0
+       iget-byte v1, v0, dot.junit.opcodes.iget_byte.d.T_iget_byte_9.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java
new file mode 100644
index 0000000..476ae5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_byte.d;
+
+public class T_iget_byte_9 {
+    
+    public byte run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/TestStubs.java
new file mode 100644
index 0000000..5bf73ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_char;
+
+public class TestStubs {
+    // used by testVFE4
+    private char TestStubField = 50;
+    // ussed by testVFE15
+    protected char TestStubProtectedField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/Test_iget_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/Test_iget_char.java
new file mode 100644
index 0000000..c7516e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/Test_iget_char.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_char.d.T_iget_char_1;
+import dot.junit.opcodes.iget_char.d.T_iget_char_11;
+import dot.junit.opcodes.iget_char.d.T_iget_char_12;
+import dot.junit.opcodes.iget_char.d.T_iget_char_13;
+import dot.junit.opcodes.iget_char.d.T_iget_char_21;
+import dot.junit.opcodes.iget_char.d.T_iget_char_5;
+import dot.junit.opcodes.iget_char.d.T_iget_char_6;
+import dot.junit.opcodes.iget_char.d.T_iget_char_7;
+import dot.junit.opcodes.iget_char.d.T_iget_char_8;
+import dot.junit.opcodes.iget_char.d.T_iget_char_9;
+
+public class Test_iget_char extends DxTestCase {
+    
+    /**
+     * @title get char from field 
+     */
+    public void testN1() {
+        T_iget_char_1 t = new T_iget_char_1();
+        assertEquals(77, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_1
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_11
+        T_iget_char_11 t = new T_iget_char_11();
+        assertEquals(77, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_char_9 t = new T_iget_char_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+   
+
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B13 
+     * @title read char from long field - only field with same name but 
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_char_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError t) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_6
+        //@uses dot.junit.opcodes.iget_char.TestStubs
+        try {
+            new T_iget_char_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError t) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_char_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError t) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_char_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError t) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_12
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_1
+        try {
+            new T_iget_char_12().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError t) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget_char shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_char shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_char shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_char shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_char shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * @constraint B1 
+     * @title iget_char shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * @constraint B1 
+     * @title iget_char shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_21
+        //@uses dot.junit.opcodes.iget_char.TestStubs
+        try {
+            new T_iget_char_21().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError t) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static  field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_char.d.T_iget_char_5
+        //@uses dot.junit.opcodes.iget_char.TestStubs
+        try {
+            new T_iget_char_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError t) {
+            // expected
+        }
+    }
+    
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_char.d.T_iget_char_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d
new file mode 100644
index 0000000..837dd6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_1.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_1
+.super java/lang/Object
+
+.field public  i1 C
+.field protected  p1 C
+.field private  pvt1 C
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const v0, 77
+       iput-char v0, v1, dot.junit.opcodes.iget_char.d.T_iget_char_1.i1 C
+
+       const v0, 77
+       iput-char v0, v1, dot.junit.opcodes.iget_char.d.T_iget_char_1.p1 C
+
+       const v0, 77
+       iput-char v0, v1, dot.junit.opcodes.iget_char.d.T_iget_char_1.pvt1 C
+       
+       
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_1.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java
new file mode 100644
index 0000000..227f97a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_1 {
+    public  char i1 = 77;
+    protected  char p1 = 77;
+    private  char pvt1 = 77;
+    
+    public char run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d
new file mode 100644
index 0000000..9d74992
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_11.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_11
+.super dot/junit/opcodes/iget_char/d/T_iget_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_char/d/T_iget_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_1.p1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java
new file mode 100644
index 0000000..cdd08a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_11 extends T_iget_char_1 {
+
+    public char run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d
new file mode 100644
index 0000000..5194ff9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_12.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_12
+.super dot/junit/opcodes/iget_char/d/T_iget_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_char/d/T_iget_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_1.pvt1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java
new file mode 100644
index 0000000..611b24b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_12 extends T_iget_char_1 {
+
+    @Override
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d
new file mode 100644
index 0000000..a7f5e58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_13.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_13.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java
new file mode 100644
index 0000000..33cae33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_13 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d
new file mode 100644
index 0000000..46f0e20
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_14.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d
new file mode 100644
index 0000000..e8c7195
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_15.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_15
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d
new file mode 100644
index 0000000..34dbaf0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_16.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_16
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d
new file mode 100644
index 0000000..cde1b06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_17.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_17
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d
new file mode 100644
index 0000000..f32f364
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_18.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_18
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d
new file mode 100644
index 0000000..5efa5ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_19.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d
new file mode 100644
index 0000000..895f42e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_20.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v0, v2, dot.junit.opcodes.iget_char.d.T_iget_char_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d
new file mode 100644
index 0000000..4902259
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_21.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_char/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_char/TestStubs/<init>()V
+
+       iget-char v1, v0, dot.junit.opcodes.iget_char.TestStubs.TestStubProtectedField C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java
new file mode 100644
index 0000000..6517824
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_21 {
+
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d
new file mode 100644
index 0000000..7838f58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_3.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_3
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-char v3, v2, dot.junit.opcodes.iget_char.d.T_iget_char_3.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d
new file mode 100644
index 0000000..bdc90d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_30.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_30
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_char/d/T_iget_char_30
+    iget-char v1, v0, dot.junit.opcodes.iget_char.d.T_iget_char_30.st_i1 C
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d
new file mode 100644
index 0000000..428c14b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_4.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_4
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_4.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh
new file mode 100644
index 0000000..270fbc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_char/d/T_iget_char_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_char/d/T_iget_char_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 583643f9
+    F9 43 36 58 
+// parsed: offset 12, len 20: signature           : c593...65f6
+    C5 93 2D 56 9E A8 DE 9C EB 9B 10 08 C0 63 49 6A B5 96 65 F6 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "C"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/iget_char/d/T_iget_char_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_iget_char_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "C"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iget_char/d/T_iget_char_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "C"
+//     return_type_idx: 0 (0x000000) "C"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iget_char/d/T_iget_char_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_char_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_char.d.T_iget_char_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_char.d.T_iget_char_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget-char v1, v2, Ldot/junit/opcodes/iget_char/d/T_iget_char_4;.i1:C // field@0000
+//@mod            57 21 00 00 
+            57 21 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "C"
+    01 43 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iget_char/d/T_iget_char_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 63 68 61 72 2F 64 2F 54 5F 69 67 65 74 5F 63 68 61 72 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_iget_char_4.java"
+    12 54 5F 69 67 65 74 5F 63 68 61 72 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_char/d/T_iget_char_4;"
+    // parsed: offset 406, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d
new file mode 100644
index 0000000..534412f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_5.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_5
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_5.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java
new file mode 100644
index 0000000..4975e76
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_5 {
+
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d
new file mode 100644
index 0000000..0d208b3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_6.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_char/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_char/TestStubs/<init>()V
+
+       iget-char v1, v0, dot.junit.opcodes.iget_char.TestStubs.TestStubField C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java
new file mode 100644
index 0000000..8be8c2b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_6 {
+
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d
new file mode 100644
index 0000000..b2ca2ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_7.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_7no_class.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java
new file mode 100644
index 0000000..4ca80d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_7 {
+
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d
new file mode 100644
index 0000000..7a75de0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_8.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       iget-char v1, v2, dot.junit.opcodes.iget_char.d.T_iget_char_8.i1N C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java
new file mode 100644
index 0000000..49d35c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_8 {
+
+    public char run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d
new file mode 100644
index 0000000..70eca20
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_char_9.java
+.class public dot.junit.opcodes.iget_char.d.T_iget_char_9
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       const v0, 0    
+       iget-char v1, v0, dot.junit.opcodes.iget_char.d.T_iget_char_9.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java
new file mode 100644
index 0000000..6bbe1ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_char.d;
+
+public class T_iget_char_9 {
+    
+    public char run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/TestStubs.java
new file mode 100644
index 0000000..0a68e56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_object;
+
+public class TestStubs {
+    // used by testVFE4
+    private Object TestStubField = null;
+    // used by testVFE15
+    protected Object TestStubProtectedField = null;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/Test_iget_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/Test_iget_object.java
new file mode 100644
index 0000000..3a735b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/Test_iget_object.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_object.d.T_iget_object_1;
+import dot.junit.opcodes.iget_object.d.T_iget_object_11;
+import dot.junit.opcodes.iget_object.d.T_iget_object_12;
+import dot.junit.opcodes.iget_object.d.T_iget_object_13;
+import dot.junit.opcodes.iget_object.d.T_iget_object_21;
+import dot.junit.opcodes.iget_object.d.T_iget_object_22;
+import dot.junit.opcodes.iget_object.d.T_iget_object_5;
+import dot.junit.opcodes.iget_object.d.T_iget_object_6;
+import dot.junit.opcodes.iget_object.d.T_iget_object_7;
+import dot.junit.opcodes.iget_object.d.T_iget_object_8;
+import dot.junit.opcodes.iget_object.d.T_iget_object_9;
+
+public class Test_iget_object extends DxTestCase {
+    
+    /**
+     * @title get reference from field 
+     */
+    public void testN1() {
+        T_iget_object_1 t = new T_iget_object_1();
+        assertEquals(null, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_1
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_11
+        T_iget_object_11 t = new T_iget_object_11();
+        assertEquals(null, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_object_9 t = new T_iget_object_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }  
+
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B13 
+     * @title  (read object from long field - only field with same name but 
+     * different type exists)
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_object_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_6
+        //@uses dot.junit.opcodes.iget_object.TestStubs
+        try {
+            new T_iget_object_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_object_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_object_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_12
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_1
+        try {
+            new T_iget_object_12().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget_object shall not work for short fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for char fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_object shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * 
+     * @constraint B13 
+     * @title  only field of different type exists
+     */
+    public void testVFE15() {
+        try {
+            new T_iget_object_21().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_22
+        //@uses dot.junit.opcodes.iget_object.TestStubs
+        try {
+            new T_iget_object_22().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static field.
+     */
+    public void testVFE17() {
+        //@uses dot.junit.opcodes.iget_object.d.T_iget_object_5
+        //@uses dot.junit.opcodes.iget_object.TestStubs
+        try {
+            new T_iget_object_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_object.d.T_iget_object_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d
new file mode 100644
index 0000000..5e4967f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_1.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_1
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+.field protected  p1 Ljava/lang/Object;
+.field private  pvt1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       const v0, 0
+       iput-object v0, v1, dot.junit.opcodes.iget_object.d.T_iget_object_1.i1 Ljava/lang/Object;
+
+       const v0, 0
+       iput-object v0, v1, dot.junit.opcodes.iget_object.d.T_iget_object_1.p1 Ljava/lang/Object;
+
+       const v0, 0
+       iput-object v0, v1, dot.junit.opcodes.iget_object.d.T_iget_object_1.pvt1 Ljava/lang/Object;
+       
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_1.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java
new file mode 100644
index 0000000..a063f8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_1 {
+    public  Object i1 = null;
+    protected  Object p1 = null;
+    private  Object pvt1 = null;
+    
+    public Object run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d
new file mode 100644
index 0000000..35a2de0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_11.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_11
+.super dot/junit/opcodes/iget_object/d/T_iget_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_object/d/T_iget_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_1.p1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java
new file mode 100644
index 0000000..5fdf44a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_11 extends T_iget_object_1 {
+
+    public Object run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d
new file mode 100644
index 0000000..b2d7400
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_12.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_12
+.super dot/junit/opcodes/iget_object/d/T_iget_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_object/d/T_iget_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_1.pvt1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java
new file mode 100644
index 0000000..f98c36a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_12  extends T_iget_object_1 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d
new file mode 100644
index 0000000..21414cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_13.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_13.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java
new file mode 100644
index 0000000..85a8761
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_13  {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d
new file mode 100644
index 0000000..df2581c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_14.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_14
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_14.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d
new file mode 100644
index 0000000..313ec7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_15.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_15
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_15.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d
new file mode 100644
index 0000000..d9df4aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_16.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_16
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d
new file mode 100644
index 0000000..82cb90e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_17.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_17
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d
new file mode 100644
index 0000000..3dac91f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_18.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_18
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d
new file mode 100644
index 0000000..19a9277
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_19.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d
new file mode 100644
index 0000000..71751fb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_20.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v0, v2, dot.junit.opcodes.iget_object.d.T_iget_object_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d
new file mode 100644
index 0000000..10143a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_21.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_21
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       
+       new-instance v0, java/lang/Object
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       
+       iput-object v0, v1, dot.junit.opcodes.iget_object.d.T_iget_object_21.i1 Ljava/lang/Object;
+       
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_21.i1 Ljava/lang/String;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java
new file mode 100644
index 0000000..e301893
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_21  {
+
+    public String run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d
new file mode 100644
index 0000000..2858934
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_22.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_22
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_object/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_object/TestStubs/<init>()V
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.TestStubs.TestStubProtectedField Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java
new file mode 100644
index 0000000..d9ad933
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_22  {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d
new file mode 100644
index 0000000..4999f1a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_3.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_3
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-object v3, v2, dot.junit.opcodes.iget_object.d.T_iget_object_3.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d
new file mode 100644
index 0000000..621f235
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_30.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_30
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_object/d/T_iget_object_30
+    iget-object v1, v0, dot.junit.opcodes.iget_object.d.T_iget_object_30.st_i1 Ljava/lang/Object;
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d
new file mode 100644
index 0000000..9a05156
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_4.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_4
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_4.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh
new file mode 100644
index 0000000..a031623
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_object/d/T_iget_object_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_object/d/T_iget_object_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 70da44ea
+    EA 44 DA 70 
+// parsed: offset 12, len 20: signature           : 6c85...f80f
+    6C 85 8D 3C F4 BD 5A AF 3C BC 06 C0 24 6F AA 65 52 1A F8 0F 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 156 (0x00009c)
+    9C 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 188 (0x0000bc)
+    BC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 244 (0x0000f4)
+    F4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "L"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/iget_object/d/T_iget_object_4;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_iget_object_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "i1"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "run"
+    93 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iget_object/d/T_iget_object_4;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 156, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 1 (0x000001) "Ljava/lang/Object;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 00 00 00 00 
+// parsed: offset 168, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  type_idx: 1 (0x000001) name_idx: 6 (0x000006) "i1"
+    00 00 01 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 188, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 196, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 204, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 212, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iget_object/d/T_iget_object_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_object_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 408 (0x000198)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 98 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_object.d.T_iget_object_4.<init>"
+    // parsed: offset 244, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 246, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 248, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 250, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 252, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 256, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 260, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 266, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_object.d.T_iget_object_4.run"
+    // parsed: offset 268, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 284, len 4: |0000: iget-object v1, v2, Ldot/junit/opcodes/iget_object/d/T_iget_object_4;.i1:Ljava/lang/Object; // field@0000
+//@mod            54 21 00 00 
+            54 21 00 01 
+        // parsed: offset 288, len 2: |0002: return-object v1
+            11 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 290, len 2: PADDING
+    00 00 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 303, len 51: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iget_object/d/T_iget_object_4;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 6F 62 6A 65 63 74 2F 64 2F 54 5F 69 67 65 74 5F 6F 62 6A 65 63 74 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 22: TYPE_STRING_DATA_ITEM [4] "T_iget_object_4.java"
+    14 54 5F 69 67 65 74 5F 6F 62 6A 65 63 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 403, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_object/d/T_iget_object_4;"
+    // parsed: offset 408, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 409, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 410, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 411, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 412, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 413, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 244 (0x0000f4)
+                F4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 268 (0x00010c)
+                8C 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 144 (0x000090)
+        02 00 00 00 03 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 156 (0x00009c)
+        03 00 00 00 02 00 00 00 9C 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 180 (0x0000b4)
+        04 00 00 00 01 00 00 00 B4 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 188 (0x0000bc)
+        05 00 00 00 03 00 00 00 BC 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 212 (0x0000d4)
+        06 00 00 00 01 00 00 00 D4 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 244 (0x0000f4)
+        01 20 00 00 02 00 00 00 F4 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 292 (0x000124)
+        02 20 00 00 08 00 00 00 24 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 20 00 00 01 00 00 00 98 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d
new file mode 100644
index 0000000..ed15e90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_5.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_5
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_5.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java
new file mode 100644
index 0000000..3626499
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_5  {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d
new file mode 100644
index 0000000..e9082e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_6.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_object/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_object/TestStubs/<init>()V
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.TestStubs.TestStubField Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java
new file mode 100644
index 0000000..a4ba515
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_6  {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d
new file mode 100644
index 0000000..db5f6f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_7.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_7no_class.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java
new file mode 100644
index 0000000..2940ca4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_7  {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d
new file mode 100644
index 0000000..67f7b82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_8.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       iget-object v1, v2, dot.junit.opcodes.iget_object.d.T_iget_object_8.i1N Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java
new file mode 100644
index 0000000..3b5c4d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_8  {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d
new file mode 100644
index 0000000..7899b37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_object_9.java
+.class public dot.junit.opcodes.iget_object.d.T_iget_object_9
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       const v0, 0
+       iget-object v1, v0, dot.junit.opcodes.iget_object.d.T_iget_object_9.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java
new file mode 100644
index 0000000..7ff752e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_object.d;
+
+public class T_iget_object_9 {
+    
+    public Object run(){
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/TestStubs.java
new file mode 100644
index 0000000..8580ec3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short;
+
+public class TestStubs {
+    // used by testVFE4
+    private short TestStubField = 50;
+    // used by testVFE15
+    protected short TestStubProtectedField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/Test_iget_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/Test_iget_short.java
new file mode 100644
index 0000000..a7d3658
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/Test_iget_short.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_short.d.T_iget_short_1;
+import dot.junit.opcodes.iget_short.d.T_iget_short_11;
+import dot.junit.opcodes.iget_short.d.T_iget_short_12;
+import dot.junit.opcodes.iget_short.d.T_iget_short_13;
+import dot.junit.opcodes.iget_short.d.T_iget_short_21;
+import dot.junit.opcodes.iget_short.d.T_iget_short_5;
+import dot.junit.opcodes.iget_short.d.T_iget_short_6;
+import dot.junit.opcodes.iget_short.d.T_iget_short_7;
+import dot.junit.opcodes.iget_short.d.T_iget_short_8;
+import dot.junit.opcodes.iget_short.d.T_iget_short_9;
+
+public class Test_iget_short extends DxTestCase {
+    
+    /**
+     * @title get short from field
+     */
+    public void testN1() {
+        T_iget_short_1 t = new T_iget_short_1();
+        assertEquals(32000, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_1
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_11
+        T_iget_short_11 t = new T_iget_short_11();
+        assertEquals(32000, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_short_9 t = new T_iget_short_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+  
+
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B13 
+     * @title read short from long field - only field with same name but 
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_short_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_6
+        //@uses dot.junit.opcodes.iget_short.TestStubs
+        try {
+            new T_iget_short_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_short_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_short_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_12
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_1
+        try {
+            new T_iget_short_12().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget_short shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for char fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget_short shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_21
+        //@uses dot.junit.opcodes.iget_short.TestStubs
+        try {
+            new T_iget_short_21().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static  field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_short.d.T_iget_short_5
+        //@uses dot.junit.opcodes.iget_short.TestStubs
+        try {
+            new T_iget_short_5().run();
+            fail("expected an IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_short.d.T_iget_short_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d
new file mode 100644
index 0000000..822f09e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_1.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_1
+.super java/lang/Object
+
+.field public  i1 S
+.field protected  p1 S
+.field private  pvt1 S
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       const v0, 32000
+       iput-short v0, v1, dot.junit.opcodes.iget_short.d.T_iget_short_1.i1 S
+
+       const v0, 32000
+       iput-short v0, v1, dot.junit.opcodes.iget_short.d.T_iget_short_1.p1 S
+
+       const v0, 32000
+       iput-short v0, v1, dot.junit.opcodes.iget_short.d.T_iget_short_1.pvt1 S
+       
+       
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_1.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java
new file mode 100644
index 0000000..d70b7a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_1 {
+    public  short i1 = 32000;
+    protected  short p1 = 32000;
+    private  short pvt1 = 32000;
+    
+    public short run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d
new file mode 100644
index 0000000..0dfd2f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_11.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_11
+.super dot/junit/opcodes/iget_short/d/T_iget_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_short/d/T_iget_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_1.p1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java
new file mode 100644
index 0000000..0fd12c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_11 extends T_iget_short_1 {
+
+    public short run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d
new file mode 100644
index 0000000..e47f6a6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_12.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_12
+.super dot/junit/opcodes/iget_short/d/T_iget_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_short/d/T_iget_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_1.pvt1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java
new file mode 100644
index 0000000..be322f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_12 extends T_iget_short_1 {
+
+    @Override
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d
new file mode 100644
index 0000000..22a94a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_13.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_13
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_13.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java
new file mode 100644
index 0000000..3b27d6c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_13 {
+
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d
new file mode 100644
index 0000000..9e0367a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_14.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d
new file mode 100644
index 0000000..cf1fbf5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_15.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_15
+.super java/lang/Object
+
+.field public i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_15.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d
new file mode 100644
index 0000000..635640a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_16.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_16
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d
new file mode 100644
index 0000000..6a717be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_17.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_17
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d
new file mode 100644
index 0000000..70dda5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_18.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_18
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d
new file mode 100644
index 0000000..cdaa952
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_19.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_19
+.super java/lang/Object
+
+.field public  i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d
new file mode 100644
index 0000000..5568f60
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_20.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_20
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v0, v2, dot.junit.opcodes.iget_short.d.T_iget_short_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
new file mode 100644
index 0000000..eff1f49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_21.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iget_short/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_short/TestStubs/<init>()V
+       
+       iget-wide v1, v0, dot.junit.opcodes.iget_short.TestStubs.TestStubProtectedField S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java
new file mode 100644
index 0000000..5bb7f6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_21 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d
new file mode 100644
index 0000000..0de7441
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_3.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_3
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-short v3, v2, dot.junit.opcodes.iget_short.d.T_iget_short_3.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d
new file mode 100644
index 0000000..bc8bc9f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_30.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_30
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_short/d/T_iget_short_30
+    iget-short v1, v0, dot.junit.opcodes.iget_short.d.T_iget_short_30.st_i1 S
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d
new file mode 100644
index 0000000..9e2ffb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_4.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_4
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_4.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh
new file mode 100644
index 0000000..3716e2a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_short/d/T_iget_short_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_short/d/T_iget_short_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 636b4534
+    34 45 6B 63 
+// parsed: offset 12, len 20: signature           : 7e12...b877
+    7E 12 BB A2 6A C1 65 67 56 AC 7C 83 C7 BA 11 D9 23 22 B8 77 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "Ldot/junit/opcodes/iget_short/d/T_iget_short_4;"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 353 (0x000161) "Ljava/lang/Object;"
+    61 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 373 (0x000175) "S"
+    75 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 376 (0x000178) "T_iget_short_4.java"
+    78 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "i1"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 404 (0x000194) "run"
+    94 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/iget_short/d/T_iget_short_4;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "S"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 3 (0x000003) "S"
+//     return_type_idx: 2 (0x000002) "S"
+//     parameters_off: 0 (0x000000)
+    03 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  type_idx: 2 (0x000002) name_idx: 6 (0x000006) "i1"
+    00 00 02 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iget_short/d/T_iget_short_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_short_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 409 (0x000199)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 99 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_short.d.T_iget_short_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_short.d.T_iget_short_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget-short v1, v2, Ldot/junit/opcodes/iget_short/d/T_iget_short_4;.i1:S // field@0000
+//@mod            58 21 00 00 
+            58 21 00 01
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 49: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/iget_short/d/T_iget_short_4;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 73 68 6F 72 74 2F 64 2F 54 5F 69 67 65 74 5F 73 68 6F 72 74 5F 34 3B 00 
+// parsed: offset 353, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 373, len 3: TYPE_STRING_DATA_ITEM [3] "S"
+    01 53 00 
+// parsed: offset 376, len 21: TYPE_STRING_DATA_ITEM [4] "T_iget_short_4.java"
+    13 54 5F 69 67 65 74 5F 73 68 6F 72 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 404, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_short/d/T_iget_short_4;"
+    // parsed: offset 409, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 410, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 411, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 412, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 413, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 414, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 415, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 416, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 419, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 421, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 422, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 423, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 425, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 409 (0x000199)
+        00 20 00 00 01 00 00 00 99 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d
new file mode 100644
index 0000000..ac92c40
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_5.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_5
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_5.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java
new file mode 100644
index 0000000..37c4351
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_5 {
+
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d
new file mode 100644
index 0000000..764d42e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_6.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.TestStubs.TestStubField S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java
new file mode 100644
index 0000000..5ac127b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_6 {
+
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d
new file mode 100644
index 0000000..3a042d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_7.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_7no_class.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java
new file mode 100644
index 0000000..7c81be5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_7 {
+
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d
new file mode 100644
index 0000000..129d2e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_8.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       iget-short v1, v2, dot.junit.opcodes.iget_short.d.T_iget_short_8.i1N S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java
new file mode 100644
index 0000000..f22a81e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_8 {
+
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d
new file mode 100644
index 0000000..8721333
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_short_9.java
+.class public dot.junit.opcodes.iget_short.d.T_iget_short_9
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       const v0, 0
+       iget-short v1, v0, dot.junit.opcodes.iget_short.d.T_iget_short_9.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java
new file mode 100644
index 0000000..178efc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_short.d;
+
+public class T_iget_short_9 {
+    
+    public short run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/TestStubs.java
new file mode 100644
index 0000000..f90a470
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/TestStubs.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide;
+
+public class TestStubs {
+    // used by testVFE4
+    private long TestStubField = 50;
+    // ussed by testVFE15
+    protected long TestStubProtectedField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java
new file mode 100644
index 0000000..7e42d32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_1;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_11;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_12;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_13;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_2;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_21;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_5;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_6;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_7;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_8;
+import dot.junit.opcodes.iget_wide.d.T_iget_wide_9;
+
+public class Test_iget_wide extends DxTestCase {
+    
+    /**
+     * @title type - long
+     */
+    public void testN1() {
+        T_iget_wide_1 t = new T_iget_wide_1();
+        assertEquals(12345679890123l, t.run());
+    }
+
+    /**
+     * @title type - double
+     */
+    public void testN2() {
+        T_iget_wide_2 t = new T_iget_wide_2();
+        assertEquals(123.0, t.run());
+    }
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_1
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_11
+        T_iget_wide_11 t = new T_iget_wide_11();
+        assertEquals(10, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iget_wide_9 t = new T_iget_wide_9();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }   
+
+    /**
+     * @constraint A11 
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B13 
+     * @title read long from integer field - only field with same name but 
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_iget_wide_13().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+    
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_6
+        //@uses dot.junit.opcodes.iget_wide.TestStubs
+        try {
+            new T_iget_wide_6().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class. 
+     */
+    public void testVFE5() {
+        try {
+            new T_iget_wide_7().run();
+            fail("expected a NoClassDefFoundError exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_iget_wide_8().run();
+            fail("expected a NoSuchFieldError exception");
+        } catch (NoSuchFieldError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_12
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_1
+        try {
+            new T_iget_wide_12().run();
+            fail("expected a IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+   
+    /**
+     * @constraint B1 
+     * @title iget-wide shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for boolean fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for float fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    } 
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title iget-wide shall not work for int fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B12
+     * @title Attempt to read inaccessible protected field.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_21
+        //@uses dot.junit.opcodes.iget_wide.TestStubs
+        try {
+            new T_iget_wide_21().run();
+            fail("expected an IllegalAccessError exception");
+        } catch (IllegalAccessError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title Attempt to read static  field.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.iget_wide.d.T_iget_wide_5
+        //@uses dot.junit.opcodes.iget_wide.TestStubs
+        try {
+            new T_iget_wide_5().run();
+            fail("expected a IncompatibleClassChangeError exception");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint B6 
+     * @title instance fields may only be accessed on already initialized instances. 
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iget_wide.d.T_iget_wide_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d
new file mode 100644
index 0000000..3919e04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_1.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_1
+.super java/lang/Object
+
+.field public  i1 J
+.field protected  p1 J
+.field private  pvt1 J
+
+
+.method public <init>()V
+.limit regs 3
+
+       invoke-direct {v2}, java/lang/Object/<init>()V
+       
+       const-wide v0, 12345679890123
+       iput-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.i1 J
+
+       const-wide v0, 10
+       iput-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.p1 J
+
+       const-wide v0, 20
+       iput-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.pvt1 J
+       
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java
new file mode 100644
index 0000000..309671d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_1 {
+    public  long i1 = 12345679890123l;
+    protected  long p1 = 10;
+    private  long pvt1 = 20;
+    
+    public long run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d
new file mode 100644
index 0000000..9a6f454
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_11.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_11
+.super dot/junit/opcodes/iget_wide/d/T_iget_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_wide/d/T_iget_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.p1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java
new file mode 100644
index 0000000..c93589e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_11 extends T_iget_wide_1 {
+
+    public long run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d
new file mode 100644
index 0000000..9a2cc44
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_12.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_12
+.super dot/junit/opcodes/iget_wide/d/T_iget_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iget_wide/d/T_iget_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_1.pvt1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java
new file mode 100644
index 0000000..af3cbda
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_12 extends T_iget_wide_1 {
+
+    @Override
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d
new file mode 100644
index 0000000..63affb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_13.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_13
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_13.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java
new file mode 100644
index 0000000..98086a6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_13 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d
new file mode 100644
index 0000000..3ffdc18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_14.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_14
+.super java/lang/Object
+
+.field public  i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d
new file mode 100644
index 0000000..5b7424b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_15.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_15
+.super java/lang/Object
+
+.field public  i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d
new file mode 100644
index 0000000..ce37389
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_16.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_16
+.super java/lang/Object
+
+.field public  i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_16.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d
new file mode 100644
index 0000000..1181a48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_17.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_17
+.super java/lang/Object
+
+.field public  i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d
new file mode 100644
index 0000000..03c2a0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_18.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_18
+.super java/lang/Object
+
+.field public  i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d
new file mode 100644
index 0000000..1978e12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_19.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_19
+.super java/lang/Object
+
+.field public  i1 F
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_19.i1 F
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d
new file mode 100644
index 0000000..16f9f5a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_2.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_2
+.super java/lang/Object
+
+.field public  val D
+
+.method public <init>()V
+.limit regs 3
+
+       invoke-direct {v2}, java/lang/Object/<init>()V
+       
+       const-wide v0, 123.0
+       iput-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_2.val D
+       
+       return-void
+.end method
+
+.method public run()D
+.limit regs 4
+
+       iget-wide v1, v3, dot.junit.opcodes.iget_wide.d.T_iget_wide_2.val D
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java
new file mode 100644
index 0000000..726f4b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_2 {
+
+    public  double val = 123.0d;
+    
+    public double run() {
+        return val;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d
new file mode 100644
index 0000000..1f3e225
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_20.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_20
+.super java/lang/Object
+
+.field public  i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_20.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d
new file mode 100644
index 0000000..fea700d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_21.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       
+       new-instance v0, Ldot/junit/opcodes/iget_wide/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_wide/TestStubs/<init>()V
+       
+       iget-wide v1, v0, dot.junit.opcodes.iget_wide.TestStubs.TestStubProtectedField J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java
new file mode 100644
index 0000000..affeadf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_21 {
+
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d
new file mode 100644
index 0000000..bb7026e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_3.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_3
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iget-wide v3, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_3.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d
new file mode 100644
index 0000000..432f376
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_30.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_30
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iget_wide/d/T_iget_wide_30
+    iget-wide v1, v0, dot.junit.opcodes.iget_wide.d.T_iget_wide_30.st_i1 J
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d
new file mode 100644
index 0000000..8dd2d4e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_4.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_4
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_4.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh
new file mode 100644
index 0000000..489efd2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 1ffd428b
+    8B 42 FD 1F 
+// parsed: offset 12, len 20: signature           : 2608...94cb
+    26 08 93 C5 49 69 AF 88 0D C9 EC 21 52 81 36 4E CA 50 94 CB 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "J"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_iget_wide_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "J"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "J"
+//     return_type_idx: 0 (0x000000) "J"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iget_wide_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iget_wide.d.T_iget_wide_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iget_wide.d.T_iget_wide_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: iget-wide v1, v2, Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;.i1:J // field@0000
+//@mod            53 21 00 00 
+            53 21 00 01
+        // parsed: offset 292, len 2: |0002: return-wide v1
+            10 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "J"
+    01 4A 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 67 65 74 5F 77 69 64 65 2F 64 2F 54 5F 69 67 65 74 5F 77 69 64 65 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_iget_wide_4.java"
+    12 54 5F 69 67 65 74 5F 77 69 64 65 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iget_wide/d/T_iget_wide_4;"
+    // parsed: offset 406, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d
new file mode 100644
index 0000000..cab5c10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_5.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_5
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_5.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java
new file mode 100644
index 0000000..c4c130e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_5 {
+
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d
new file mode 100644
index 0000000..ba13f26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_6.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       
+       new-instance v0, Ldot/junit/opcodes/iget_wide/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iget_wide/TestStubs/<init>()V
+       
+       iget-wide v1, v0, dot.junit.opcodes.iget_wide.TestStubs.TestStubField J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java
new file mode 100644
index 0000000..649795f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_6 {
+
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d
new file mode 100644
index 0000000..572fdbe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_7.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_7no_class.i1 J
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java
new file mode 100644
index 0000000..0866645
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_7 {
+
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d
new file mode 100644
index 0000000..96b8c56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_8.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       iget-wide v1, v2, dot.junit.opcodes.iget_wide.d.T_iget_wide_8.i1N J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java
new file mode 100644
index 0000000..570764d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_8 {
+
+    public long run() {
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d
new file mode 100644
index 0000000..3cb12cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iget_wide_9.java
+.class public dot.junit.opcodes.iget_wide.d.T_iget_wide_9
+.super java/lang/Object
+
+.field public  i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       const v0, 0
+       iget-wide v1, v0, dot.junit.opcodes.iget_wide.d.T_iget_wide_9.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java
new file mode 100644
index 0000000..6999d93
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iget_wide.d;
+
+public class T_iget_wide_9 {
+    
+    public long run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/TestStubs.java
new file mode 100644
index 0000000..9867d92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/TestStubs.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of;
+
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/Test_instance_of.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/Test_instance_of.java
new file mode 100644
index 0000000..b0a6cc6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/Test_instance_of.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.instance_of.d.T_instance_of_1;
+import dot.junit.opcodes.instance_of.d.T_instance_of_2;
+import dot.junit.opcodes.instance_of.d.T_instance_of_3;
+import dot.junit.opcodes.instance_of.d.T_instance_of_7;
+
+public class Test_instance_of extends DxTestCase {
+
+
+    /**
+     * @title (Object)String instanceof String
+     */
+    public void testN1() {
+        T_instance_of_1 t = new T_instance_of_1();
+        String s = "";
+        assertTrue(t.run(s));
+    }
+
+    /**
+     * @title null instanceof String
+     */
+    public void testN2() {
+        T_instance_of_1 t = new T_instance_of_1();
+        assertFalse(t.run(null));
+    }
+
+    /**
+     * @title check assignment compatibility rules
+     */
+    public void testN4() {
+        T_instance_of_2 t = new T_instance_of_2();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title T_instance_of_1 instanceof String
+     */
+    public void testE1() {
+        T_instance_of_1 t = new T_instance_of_1();
+        assertFalse(t.run(t));
+    }
+
+    /**
+     * @title Attempt to access inaccessible class.
+     */
+    public void testE2() {
+        //@uses dot.junit.opcodes.instance_of.TestStubs
+        //@uses dot.junit.opcodes.instance_of.d.T_instance_of_3
+        try {
+            T_instance_of_3 tt = new T_instance_of_3();
+            tt.run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError e) {
+        }
+    }
+
+    /**
+     * @title Attempt to access undefined class.
+     */
+    public void testE3() {
+        try {
+            T_instance_of_7 tt = new T_instance_of_7();
+            tt.run();
+            fail("expected a verification exception");
+        } catch (NoClassDefFoundError e) {
+            // expected
+        } catch(VerifyError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A19
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.instance_of.d.T_instance_of_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title type of argument - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.instance_of.d.T_instance_of_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.instance_of.d.T_instance_of_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.instance_of.d.T_instance_of_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d
new file mode 100644
index 0000000..4741d35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_1.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)Z
+.limit regs 5
+
+       instance-of v0, v4, java/lang/String
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java
new file mode 100644
index 0000000..bd9118a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of.d;
+
+public class T_instance_of_1 {
+
+    public boolean run(Object o) {
+        return o instanceof String; 
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d
new file mode 100644
index 0000000..1299b54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d
@@ -0,0 +1,119 @@
+; Copyright (C) 2008 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.
+
+.source TestStubs.java
+.interface public dot.junit.opcodes.instance_of.d.T_instance_of_2.SuperInterface
+
+.source TestStubs.java    
+.interface public dot.junit.opcodes.instance_of.d.T_instance_of_2.SuperInterface2
+
+.source TestStubs.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_2.SuperClass 
+.super java/lang/Object
+.implements dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperInterface
+    
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method    
+
+.source TestStubs.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_2.SubClass 
+.super dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass/<init>()V
+       return-void
+.end method
+
+
+.source T_instance_of_2.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 20
+
+    const v0, 0
+    
+; (SubClass instanceof SuperClass)    
+    new-instance v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass/<init>()V
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass
+    if-eqz v15, LabelExit
+    
+; (SubClass[] instanceof SuperClass[])    
+    const v11, 1
+    new-array v10, v11, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass;
+    instance-of v15, v10, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass;
+    if-eqz v15, LabelExit
+
+; (SubClass[] instanceof Object)    
+    new-array v10, v11, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass;
+    instance-of v15, v10, java/lang/Object
+    if-eqz v15, LabelExit
+    
+; (SubClass instanceof SuperInterface)    
+    new-instance v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass/<init>()V    
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperInterface
+    if-eqz v15, LabelExit
+
+; !(SuperClass instanceof SubClass)    
+    new-instance v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass
+    invoke-direct {v10}, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass/<init>()V
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass
+    if-nez v15, LabelExit
+        
+; !(SubClass instanceof SuperInterface2)    
+    new-instance v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass
+    invoke-direct {v10}, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass/<init>()V    
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperInterface2
+    if-nez v15, LabelExit
+
+; !(SubClass[] instanceof SuperInterface)    
+    new-array v10, v11, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass;
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SuperInterface
+    if-nez v15, LabelExit
+
+; !(SubClass[] instanceof SubClass)    
+    new-array v10, v11, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass;
+    instance-of v15, v10, dot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass
+    if-nez v15, LabelExit
+    
+; !(SuperClass[] instanceof SubClass[])    
+    new-array v10, v11, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SuperClass;
+    instance-of v15, v10, [Ldot/junit/opcodes/instance_of/d/T_instance_of_2/SubClass;
+    if-nez v15, LabelExit
+    
+    const v0, 1
+    
+LabelExit:        
+    return v0
+    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java
new file mode 100644
index 0000000..e7f1940
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of.d;
+
+public class T_instance_of_2 {
+
+    public boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d
new file mode 100644
index 0000000..6705dcf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_3.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+       instance-of v0, v5, dot/junit/opcodes/instance_of/TestStubs
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java
new file mode 100644
index 0000000..65a0165
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of.d;
+
+public class T_instance_of_3 {
+
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d
new file mode 100644
index 0000000..fe8b891
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_4.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+
+       instance-of v0, v4, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh
new file mode 100644
index 0000000..cec381b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh
@@ -0,0 +1,264 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/instance_of/d/T_instance_of_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/instance_of/d/T_instance_of_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 66154a36
+    36 4A 15 66 
+// parsed: offset 12, len 20: signature           : 2821...ff3e
+    28 21 65 D6 F8 0F AB 2B 99 4B 13 E4 29 66 87 41 09 61 FF 3E 
+// parsed: offset 32, len 4: file_size           : 580
+    44 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 444 (0x0001bc)
+    BC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 340
+    54 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 294 (0x000126) "<init>"
+    26 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 302 (0x00012e) "Ldot/junit/opcodes/instance_of/d/T_instance_of_4;"
+    2E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 353 (0x000161) "Ljava/lang/Object;"
+    61 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 373 (0x000175) "Ljava/lang/String;"
+    75 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 393 (0x000189) "T_instance_of_4.java"
+    89 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 415 (0x00019f) "V"
+    9F 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 418 (0x0001a2) "VL"
+    A2 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 422 (0x0001a6) "run"
+    A6 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/instance_of/d/T_instance_of_4;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/String;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "VL"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 288 (0x000120)
+    06 00 00 00 03 00 00 00 20 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/instance_of/d/T_instance_of_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_instance_of_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 427 (0x0001ab)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 AB 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.instance_of.d.T_instance_of_4.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.instance_of.d.T_instance_of_4.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 280, len 4: |0000: instance-of v0, v4, Ljava/lang/String; // class@0002
+//@mod             20 40 02 00         
+            20 40 02 01 
+        // parsed: offset 284, len 2: |0002: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 286, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 288, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 292, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 294, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 302, len 51: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/instance_of/d/T_instance_of_4;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 73 74 61 6E 63 65 5F 6F 66 2F 64 2F 54 5F 69 6E 73 74 61 6E 63 65 5F 6F 66 5F 34 3B 00 
+// parsed: offset 353, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 373, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 393, len 22: TYPE_STRING_DATA_ITEM [4] "T_instance_of_4.java"
+    14 54 5F 69 6E 73 74 61 6E 63 65 5F 6F 66 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 415, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 418, len 4: TYPE_STRING_DATA_ITEM [6] "VL"
+    02 56 4C 00 
+// parsed: offset 422, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/instance_of/d/T_instance_of_4;"
+    // parsed: offset 427, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 428, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 429, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 430, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 431, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 432, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 435, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 437, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 438, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 439, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 441, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 444, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 448, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 460, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 472, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 484, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 496, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 508, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 520, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 532, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 288 (0x000120)
+        01 10 00 00 01 00 00 00 20 01 00 00 
+    // parsed: offset 544, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 294 (0x000126)
+        02 20 00 00 08 00 00 00 26 01 00 00 
+    // parsed: offset 556, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 427 (0x0001ab)
+        00 20 00 00 01 00 00 00 AB 01 00 00 
+    // parsed: offset 568, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 444 (0x0001bc)
+        00 10 00 00 01 00 00 00 BC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d
new file mode 100644
index 0000000..eac21b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_5.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+       const v3, 1234
+       instance-of v1, v3, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d
new file mode 100644
index 0000000..4c2e649
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_6.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+
+       instance-of v0, v5, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d
new file mode 100644
index 0000000..f0823e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_7.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       instance-of v0, v5, dot/junit/opcodes/instance_of/Test_instance_ofN
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java
new file mode 100644
index 0000000..adcd6f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.instance_of.d;
+
+public class T_instance_of_7 {
+
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d
new file mode 100644
index 0000000..2853ade
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_instance_of_8.java
+.class public dot.junit.opcodes.instance_of.d.T_instance_of_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+       const-wide v0, 1234
+       check-cast v0, java/lang/String
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java
new file mode 100644
index 0000000..55e07fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_byte.d.T_int_to_byte_1;
+import dot.junit.opcodes.int_to_byte.d.T_int_to_byte_5;
+
+
+public class Test_int_to_byte extends DxTestCase {
+    /**
+     * @title Argument = 1
+     */
+    public void testN1() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN2() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-1, t.run(-1));
+    }
+
+    /**
+     * @title Argument = 16
+     */
+    public void testN3() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(16, t.run(16));
+    }
+
+    /**
+     * @title Argument = -32
+     */
+    public void testN4() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-32, t.run(-32));
+    }
+
+    /**
+     * @title Argument = 134
+     */
+    public void testN5() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-122, t.run(134));
+    }
+
+    
+    /**
+     * @title Argument = -134
+     */
+    public void testN6() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(122, t.run(-134));
+    }
+    
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to byte makes no sense but shall not crash the VM.  
+     */
+
+    public void testN7() {
+        T_int_to_byte_5 t = new T_int_to_byte_5();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+
+    /**
+     * @title Argument = 127
+     */
+    public void testB1() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(127, t.run(127));
+    }
+
+    /**
+     * @title Argument = 128
+     */
+    public void testB2() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-128, t.run(128));
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Argument = -128
+     */
+    public void testB4() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-128, t.run(-128));
+    }
+
+    /**
+     * @title Argument = -129
+     */
+    public void testB5() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(127, t.run(-129));
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB6() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB7() {
+        T_int_to_byte_1 t = new T_int_to_byte_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE));
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_byte.d.T_int_to_byte_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_byte.d.T_int_to_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_byte.d.T_int_to_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_byte.d.T_int_to_byte_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d
new file mode 100644
index 0000000..bfbd201
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_1.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)B
+.limit regs 5
+
+       int-to-byte v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java
new file mode 100644
index 0000000..1397f49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_byte.d;
+
+public class T_int_to_byte_1 {
+
+    public byte run(int a) {
+        return (byte) a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d
new file mode 100644
index 0000000..6d18c51
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_2.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)B
+.limit regs 5
+
+       const-wide v0, 3.14
+       int-to-byte v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d
new file mode 100644
index 0000000..6136a49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_3.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)B
+.limit regs 5
+
+       const-wide v0, 1234
+       int-to-byte v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d
new file mode 100644
index 0000000..5049465
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_4.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)B
+.limit regs 5
+
+       int-to-byte v2, v3
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d
new file mode 100644
index 0000000..78fa37c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_5.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)B
+.limit regs 5
+
+       int-to-byte v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java
new file mode 100644
index 0000000..7580b7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_byte.d;
+
+public class T_int_to_byte_5 {
+
+    public byte run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d
new file mode 100644
index 0000000..66b3071
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_byte_6.java
+.class public dot.junit.opcodes.int_to_byte.d.T_int_to_byte_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)B
+.limit regs 5
+
+       int-to-byte v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java
new file mode 100644
index 0000000..b426473
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_char.d.T_int_to_char_1;
+import dot.junit.opcodes.int_to_char.d.T_int_to_char_5;
+
+
+public class Test_int_to_char extends DxTestCase {
+    /**
+     * @title Argument = 65
+     */
+    public void testN1() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('A', t.run(65));
+    }
+
+    /**
+     * @title Argument = 65537
+     */
+    public void testN2() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\u0001', t.run(65537));
+    }
+
+    /**
+     * @title Argument = -2
+     */
+    public void testN3() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\ufffe', t.run(-2));
+    }
+
+    /**
+     * @title Argument = 0x110000
+     */
+    public void testN4() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\u0000', t.run(0x110000));
+    }
+
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to char makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_int_to_char_5 t = new T_int_to_char_5();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB1() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\u0000', t.run(0));
+    }
+
+    /**
+     * @title Argument = 65535
+     */
+    public void testB2() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\uffff', t.run(65535));
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB3() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\uffff', t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_int_to_char_1 t = new T_int_to_char_1();
+        assertEquals('\u0000', t.run(Integer.MIN_VALUE));
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_char.d.T_int_to_char_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_char.d.T_int_to_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_char.d.T_int_to_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_char.d.T_int_to_char_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d
new file mode 100644
index 0000000..c469970
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_1.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)C
+.limit regs 5
+
+       int-to-char v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java
new file mode 100644
index 0000000..42ad201
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_char.d;
+
+public class T_int_to_char_1 {
+
+    public char run(int a) {
+        return (char) a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d
new file mode 100644
index 0000000..df98cf1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_2.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)C
+.limit regs 5
+
+       const-wide v0, 3.14
+       int-to-char v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d
new file mode 100644
index 0000000..e67ac88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_3.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)C
+.limit regs 5
+
+       const-wide v0, 1234
+       int-to-char v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d
new file mode 100644
index 0000000..72477b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_4.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)C
+.limit regs 5
+
+       int-to-char v2, v3
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d
new file mode 100644
index 0000000..c00482b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_5.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)C
+.limit regs 5
+
+       int-to-char v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java
new file mode 100644
index 0000000..7ebbc1a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_char.d;
+
+public class T_int_to_char_5 {
+
+    public char run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d
new file mode 100644
index 0000000..91c0397
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_char_6.java
+.class public dot.junit.opcodes.int_to_char.d.T_int_to_char_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)C
+.limit regs 5
+
+       int-to-char v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java
new file mode 100644
index 0000000..ae32560
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_double.d.T_int_to_double_1;
+import dot.junit.opcodes.int_to_double.d.T_int_to_double_6;
+
+
+public class Test_int_to_double extends DxTestCase {
+    /**
+     * @title Argument = 300000000
+     */
+    public void testN1() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(300000000d, t.run(300000000), 0d);
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(1d, t.run(1), 0d);
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(-1d, t.run(-1), 0d);
+    }
+
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to double makes no sense but shall not crash the VM.  
+     */
+
+    public void testN8() {
+        T_int_to_double_6 t = new T_int_to_double_6();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(2147483647d, t.run(Integer.MAX_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(-2147483648d, t.run(Integer.MIN_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_int_to_double_1 t = new T_int_to_double_1();
+        assertEquals(0d, t.run(0), 0d);
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_double.d.T_int_to_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_double.d.T_int_to_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_double.d.T_int_to_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_double.d.T_int_to_double_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d
new file mode 100644
index 0000000..19a17f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_1.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 6
+
+       int-to-double v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java
new file mode 100644
index 0000000..5277313
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_double.d;
+
+public class T_int_to_double_1 {
+
+    public double run(int a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d
new file mode 100644
index 0000000..adc6bfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_3.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 6
+
+       const-wide v4, 123455    
+
+       int-to-double v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d
new file mode 100644
index 0000000..51f6966
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_4.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 1
+
+       const v0, 1234
+       int-to-double v0, v0
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d
new file mode 100644
index 0000000..9d8382d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_5.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 6
+
+       int-to-double v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d
new file mode 100644
index 0000000..529f23e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_6.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 6
+
+       int-to-double v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java
new file mode 100644
index 0000000..213dc7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_double.d;
+
+public class T_int_to_double_6 {
+
+    public double run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d
new file mode 100644
index 0000000..06b12b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_double_7.java
+.class public dot.junit.opcodes.int_to_double.d.T_int_to_double_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 6
+
+       int-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java
new file mode 100644
index 0000000..8b6e978
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_float.d.T_int_to_float_1;
+import dot.junit.opcodes.int_to_float.d.T_int_to_float_5;
+
+public class Test_int_to_float extends DxTestCase {
+    /**
+     * @title Argument = 123456
+     */
+    public void testN1() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(123456f, t.run(123456), 0f);
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(1f, t.run(1), 0f);
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(-1f, t.run(-1), 0f);
+    }
+
+    /**
+     * @title Argument = 33564439
+     */
+    public void testN4() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(3.356444E7f, t.run(33564439), 0f);
+    }
+
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to float makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_int_to_float_5 t = new T_int_to_float_5();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+        
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB1() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(0f, t.run(0), 0f);
+    }
+
+    /**
+     * @title Argument = Argument = Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(2147483650f, t.run(Integer.MAX_VALUE), 0f);
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_int_to_float_1 t = new T_int_to_float_1();
+        assertEquals(-2147483650f, t.run(Integer.MIN_VALUE), 0f);
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  (type of argument - double)
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_float.d.T_int_to_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_float.d.T_int_to_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_float.d.T_int_to_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_float.d.T_int_to_float_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d
new file mode 100644
index 0000000..16b6f1a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_1.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       int-to-float v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java
new file mode 100644
index 0000000..777d81e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_float.d;
+
+public class T_int_to_float_1 {
+
+    public float run(int a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d
new file mode 100644
index 0000000..c2fdf91
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_2.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       const-wide v0, 3.14
+       int-to-float v2, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d
new file mode 100644
index 0000000..4f16417
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_3.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       const-wide v0, 1234
+       int-to-float v2, v0
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d
new file mode 100644
index 0000000..e31d685
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_4.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       int-to-float v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d
new file mode 100644
index 0000000..c5bd602
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_5.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)F
+.limit regs 5
+
+       int-to-float v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java
new file mode 100644
index 0000000..3324016
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_float.d;
+
+public class T_int_to_float_5 {
+
+    public float run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d
new file mode 100644
index 0000000..37db947
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_float_6.java
+.class public dot.junit.opcodes.int_to_float.d.T_int_to_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       int-to-float v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java
new file mode 100644
index 0000000..3147723
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_long.d.T_int_to_long_1;
+import dot.junit.opcodes.int_to_long.d.T_int_to_long_6;
+
+public class Test_int_to_long extends DxTestCase {
+    /**
+     * @title Argument = 123456
+     */
+    public void testN1() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(123456l, t.run(123456));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(1l, t.run(1));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(-1l, t.run(-1));
+    }
+    
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN8() {
+        T_int_to_long_6 t = new T_int_to_long_6();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB1() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(0l, t.run(0));
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(2147483647l, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_int_to_long_1 t = new T_int_to_long_1();
+        assertEquals(-2147483648l, t.run(Integer.MIN_VALUE));
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_long.d.T_int_to_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_long.d.T_int_to_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_long.d.T_int_to_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_long.d.T_int_to_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_long.d.T_int_to_long_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d
new file mode 100644
index 0000000..4f91de2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_1.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       int-to-long v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java
new file mode 100644
index 0000000..03becc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_long.d;
+
+public class T_int_to_long_1 {
+
+    public long run(int a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d
new file mode 100644
index 0000000..eab475b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_2.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       const-wide v4, 3.1415    
+
+       int-to-long v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d
new file mode 100644
index 0000000..05527d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_3.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       const-wide v4, 123455    
+
+       int-to-long v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d
new file mode 100644
index 0000000..9f26670
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_4.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 1
+
+       const v0, 1234
+       int-to-long v0, v0
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d
new file mode 100644
index 0000000..f006048
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_5.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       int-to-long v0, v4
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d
new file mode 100644
index 0000000..f71a28d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_6.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 6
+
+       int-to-long v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java
new file mode 100644
index 0000000..da307c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_long.d;
+
+public class T_int_to_long_6 {
+
+    public long run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d
new file mode 100644
index 0000000..c2db686
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_long_7.java
+.class public dot.junit.opcodes.int_to_long.d.T_int_to_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 6
+
+       int-to-long v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java
new file mode 100644
index 0000000..7e4c6a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.int_to_short.d.T_int_to_short_1;
+import dot.junit.opcodes.int_to_short.d.T_int_to_short_5;
+
+public class Test_int_to_short extends DxTestCase {
+    /**
+     * @title Argument = 1
+     */
+    public void testN1() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN2() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(-1, t.run(-1));
+    }
+
+    /**
+     * @title Argument = 32767
+     */
+    public void testN3() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(32767, t.run(32767));
+    }
+
+    /**
+     * @title Argument = -32768
+     */
+    public void testN4() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(-32768, t.run(-32768));
+    }
+
+    /**
+     * @title Argument = -32769
+     */
+    public void testN5() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(32767, t.run(-32769));
+    }
+
+    /**
+     * @title Argument = 32768
+     */
+    public void testN6() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(-32768, t.run(32768));
+    }
+
+    /**
+     * @title Argument = 0x10fedc;
+     */
+    public void testN7() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(0xfffffedc, t.run(0x10fedc));
+    }
+
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this conversion of float to short makes no sense but shall not crash the VM.  
+     */
+
+    public void testN8() {
+        T_int_to_short_5 t = new T_int_to_short_5();
+        try {
+            t.run(1.333f);
+        } catch (Throwable e) {
+        }
+    } 
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB1() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB3() {
+        T_int_to_short_1 t = new T_int_to_short_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE));
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_short.d.T_int_to_short_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_short.d.T_int_to_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_short.d.T_int_to_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.int_to_short.d.T_int_to_short_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d
new file mode 100644
index 0000000..fcf1727
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_1.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)S
+.limit regs 5
+
+       int-to-short v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java
new file mode 100644
index 0000000..2188088
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_short.d;
+
+public class T_int_to_short_1 {
+
+    public short run(int a) {
+        return (short)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d
new file mode 100644
index 0000000..9c1154b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_2.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)S
+.limit regs 5
+
+       const-wide v0, 3.14
+       int-to-short v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d
new file mode 100644
index 0000000..5f83549
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_3.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)S
+.limit regs 5
+
+       const-wide v0, 1234
+       int-to-short v2, v0
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d
new file mode 100644
index 0000000..147fb66
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_4.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)S
+.limit regs 5
+
+       int-to-short v2, v3
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d
new file mode 100644
index 0000000..8ca83e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_5.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)S
+.limit regs 5
+
+       int-to-short v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java
new file mode 100644
index 0000000..2749fc0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.int_to_short.d;
+
+public class T_int_to_short_5 {
+
+    public short run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d
new file mode 100644
index 0000000..8d6f0ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_int_to_short_6.java
+.class public dot.junit.opcodes.int_to_short.d.T_int_to_short_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)S
+.limit regs 5
+
+       int-to-short v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TAbstract.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TAbstract.java
new file mode 100644
index 0000000..f6d0ed0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TAbstract.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct;
+
+public abstract class TAbstract {
+    protected abstract int toInt();
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TPlain.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TPlain.java
new file mode 100644
index 0000000..a6db3d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TPlain.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct;
+
+public class TPlain {
+    public int toInt() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TSuper.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TSuper.java
new file mode 100644
index 0000000..03026ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/TSuper.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct;
+
+/**
+ * @author fjost
+ *
+ */
+public class TSuper {
+    public int val;
+    
+    public int toInt() {
+        return 5;
+    }
+    
+    public int toInt(float v) {
+        return (int)v;
+    }
+    
+    public int testArgsOrder(int a, int b) {
+        return a/b;
+    }
+    
+    public native int toIntNative();
+    
+    public static int toIntStatic() {
+        return 5;
+    }
+    
+    protected int toIntP() {
+        return 5;
+    }
+    
+    private int toIntPvt() {
+        return 5;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
new file mode 100644
index 0000000..e7c6a0b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_12;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_13;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_16;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_2;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_21;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_6;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_7;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_8;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_9;
+
+public class Test_invoke_direct extends DxTestCase {
+
+    /**
+     * @title private method call
+     */
+    public void testN2() {
+        T_invoke_direct_2 t = new T_invoke_direct_2();
+        assertEquals(345, t.run());
+    }
+
+
+    /**
+     * @title Check that new frame is created by invoke_direct
+     */
+    public void testN7() {
+        T_invoke_direct_21 t = new T_invoke_direct_21();
+        assertEquals(1, t.run());
+    }
+
+
+
+    /**
+     * @title objref is null
+     */
+    public void testE3() {
+        T_invoke_direct_8 t = new T_invoke_direct_8();
+        try {
+            assertEquals(5, t.run());
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE5() {
+        T_invoke_direct_9 t = new T_invoke_direct_9();
+        try {
+            assertEquals(5, t.run());
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-direct may not be used to invoke &lt;clinit&gt;
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B4
+     * @title invoke-direct target must be in self or superclass
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_6
+        //@uses dot.junit.opcodes.invoke_direct.TSuper
+        try {
+            new T_invoke_direct_6();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title int is passed instead of obj ref
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B9
+     * @title number of arguments passed to method
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing protected method
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_25
+        //@uses dot.junit.opcodes.invoke_direct.TPlain
+        //@uses dot.junit.opcodes.invoke_direct.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_25");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B5
+     * @title  Superclass' method call
+     */
+    public void testVFE11() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_25
+        //@uses dot.junit.opcodes.invoke_direct.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE13() {
+        try {
+            new T_invoke_direct_7().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE14() {
+        try {
+            new T_invoke_direct_16().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke static method. Java throws IncompatibleClassChangeError
+     * on first access but Dalvik throws VerifyError on class loading.
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of superclass.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_12
+        //@uses dot.junit.opcodes.invoke_direct.TSuper
+        try {
+            new T_invoke_direct_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke abstract method
+     */
+    public void testVFE17() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_13
+        //@uses dot.junit.opcodes.invoke_direct.TAbstract
+        try {
+            new T_invoke_direct_13().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B5
+     * @title An instance initializer must only be invoked on an uninitialized instance.
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B8
+     * @title attempt to access inherited instance field before <init> is called
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_18
+        //@uses dot.junit.opcodes.invoke_direct.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title attempt to invoke interface method
+     */
+    public void testVFE20() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_26");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE21() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_27");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d
new file mode 100644
index 0000000..65a8a32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_1.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_1
+.super dot/junit/opcodes/invoke_direct/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/TSuper/toInt()I
+       move-result v1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java
new file mode 100644
index 0000000..b692683
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+import dot.junit.opcodes.invoke_direct.TSuper;
+
+public class T_invoke_direct_1 extends TSuper {
+
+    public int run() {
+        return super.toInt();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d
new file mode 100644
index 0000000..08b22c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_10.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v0, 1222
+       invoke-direct {v0}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d
new file mode 100644
index 0000000..6566718
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_11.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot.junit.opcodes.invoke_direct.d.T_invoke_direct_11/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
+.method private static toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
new file mode 100644
index 0000000..6230fa9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_12.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_12
+.super dot/junit/opcodes/invoke_direct/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/toIntPvt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java
new file mode 100644
index 0000000..2911abf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+
+public class T_invoke_direct_12 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d
new file mode 100644
index 0000000..23d4378
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_13.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_13
+.super dot/junit/opcodes/invoke_direct/TAbstract
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TAbstract/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/TAbstract/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java
new file mode 100644
index 0000000..df8d0d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+
+public class T_invoke_direct_13 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d
new file mode 100644
index 0000000..4d10ce8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_14.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       const v3, 50
+       const v4, 25
+       
+       invoke-direct {v6, v3}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d
new file mode 100644
index 0000000..55b7d3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_15.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v3}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d
new file mode 100644
index 0000000..10e041d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_16.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16/toInt()F
+       
+       const/4 v1, 0
+       return v1
+.end method
+
+
+.method private toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java
new file mode 100644
index 0000000..cae7ae8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+
+public class T_invoke_direct_16 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d
new file mode 100644
index 0000000..35a54d9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_17.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       new-instance v0, java/lang/String
+       invoke-direct {v0} java/lang/String/<init>()V
+         invoke-direct {v0} java/lang/String/<init>()V
+       return-void       
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d
new file mode 100644
index 0000000..602cbeb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_18.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_18
+.super dot/junit/opcodes/invoke_direct/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       const v0, 0
+       iput v0, v1, dot.junit.opcodes.invoke_direct.d.T_invoke_direct_18.val I
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d
new file mode 100644
index 0000000..0c11388
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_2.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java
new file mode 100644
index 0000000..ab6e1ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_2 {
+
+    public int run() {
+        return getInt();
+    }
+
+    private int getInt() {
+        return 345;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d
new file mode 100644
index 0000000..d6653fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_21.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       const v3, 50
+       const v4, 25
+       
+       invoke-direct {v6, v3, v4}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java
new file mode 100644
index 0000000..cec52ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_21 {
+
+    
+    private int test(int a, int b) {
+        int i = 999;
+        int j = 888;
+        int k = 777;
+        return a / b;
+    }
+    
+    public int run() {
+        int i = 111;
+        int j = 222;
+        int k = 333;
+        test(50, 25);
+        
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d
new file mode 100644
index 0000000..83fd3db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_24.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_24
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       
+       const-wide v3, 50
+       
+       invoke-direct {v6, v3, v4}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d
new file mode 100644
index 0000000..8d872ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_25.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_25
+.super dot/junit/opcodes/invoke_direct/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/<init>()V
+       return-void
+.end method
+
+.method private test()V
+    return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_direct/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/TPlain/<init>()V
+
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25/test()V
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d
new file mode 100644
index 0000000..40cce50
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_direct.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_direct.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_direct.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_direct_26.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_26
+.super dot/junit/opcodes/invoke_direct/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-direct {v7}, dot/junit/opcodes/invoke_direct/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d
new file mode 100644
index 0000000..0ac6b37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_27.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_27
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test()V
+    return-void
+.end method
+
+.method public static run()V
+.limit regs 3
+
+       new-instance v0, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27
+       
+       invoke-direct {v0}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27/test()V
+       
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d
new file mode 100644
index 0000000..6aa7821
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_3.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh
new file mode 100644
index 0000000..993ee4e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh
@@ -0,0 +1,285 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : b8124ca4
+    A4 4C 12 B8 
+// parsed: offset 12, len 20: signature           : 70e1...b983
+    70 E1 1F B5 6C 1D F3 77 2E 7D E3 42 02 A1 DA DC 85 4D B9 83 
+// parsed: offset 32, len 4: file_size           : 592
+    50 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 344
+    58 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 324 (0x000144) "<init>"
+    44 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 332 (0x00014c) "I"
+    4C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 335 (0x00014f) "Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;"
+    4F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 390 (0x000186) "Ljava/lang/Object;"
+    86 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 410 (0x00019a) "T_invoke_direct_3.java"
+    9A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 434 (0x0001b2) "V"
+    B2 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 437 (0x0001b5) "getInt"
+    B5 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 445 (0x0001bd) "run"
+    BD 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "getInt"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [3] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_invoke_direct_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 450 (0x0001c2)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 C2 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct.d.T_invoke_direct_3.<init>"
+    // parsed: offset 248, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct.d.T_invoke_direct_3.getInt"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: const/16 v1, #int 345 // #0x159
+            13 01 59 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct.d.T_invoke_direct_3.run"
+    // parsed: offset 296, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 298, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 300, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 302, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 304, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 308, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 312, len 6: |0000: invoke-direct {v2}, Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;.getInt:()I // method@0001
+//@mod            70 10 01 00 02 00 
+            70 10 01 01 02 00 
+        // parsed: offset 318, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 320, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 322, len 2: PADDING
+    00 00 
+// parsed: offset 324, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 332, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 335, len 55: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 5F 33 3B 00 
+// parsed: offset 390, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 410, len 24: TYPE_STRING_DATA_ITEM [4] "T_invoke_direct_3.java"
+    16 54 5F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 434, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 437, len 8: TYPE_STRING_DATA_ITEM [6] "getInt"
+    06 67 65 74 49 6E 74 00 
+// parsed: offset 445, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_direct/d/T_invoke_direct_3;"
+    // parsed: offset 450, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 451, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 452, len 1: direct_methods_size: 2
+        02 
+    // parsed: offset 453, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 454, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 455, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 458, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+        // method [1]:
+            // parsed: offset 460, len 1: method_idx_diff: 1 (method_idx: 1 "getInt")
+                01 
+            // parsed: offset 461, len 1: access_flags: 0x000002 (PRIVATE)
+                02 
+            // parsed: offset 462, len 2: code_off: 272 (0x000110)
+                90 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 464, len 1: method_idx_diff: 2 (method_idx: 2 "run")
+                02 
+            // parsed: offset 465, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 466, len 2: code_off: 296 (0x000128)
+                A8 02 
+// map_list:
+    // parsed: offset 468, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 04 00 00 00 B8 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 03 00 00 00 F8 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 324 (0x000144)
+        02 20 00 00 08 00 00 00 44 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 450 (0x0001c2)
+        00 20 00 00 01 00 00 00 C2 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
new file mode 100644
index 0000000..e6e7511
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_4.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_4
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+    invoke-direct {v0}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4/<clinit>()V
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d
new file mode 100644
index 0000000..c4dac34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_5.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d
new file mode 100644
index 0000000..6bb8833
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d
@@ -0,0 +1,27 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_6.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V    
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/toIntPvt()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java
new file mode 100644
index 0000000..6f95a12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_6 {
+    public T_invoke_direct_6() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d
new file mode 100644
index 0000000..2c1b99b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_7.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7/toInt()I
+       const v0, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java
new file mode 100644
index 0000000..b640fa3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+
+public class T_invoke_direct_7 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d
new file mode 100644
index 0000000..99b510b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_8.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/4 v1, 0
+       invoke-direct {v1}, dot.junit.opcodes.invoke_direct.d.T_invoke_direct_8/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method private toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java
new file mode 100644
index 0000000..8c9825d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_8 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d
new file mode 100644
index 0000000..262b5ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_9.java
+.class public dot.junit.opcodes.invoke_direct.d.T_invoke_direct_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct {v2}, dot.junit.opcodes.invoke_direct.d.T_invoke_direct_9/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method private native toInt()I
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java
new file mode 100644
index 0000000..c0913ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_9 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java
new file mode 100644
index 0000000..8c5ab27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range;
+
+public abstract class TAbstract {
+    protected abstract int toInt();
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TPlain.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TPlain.java
new file mode 100644
index 0000000..3e4aab1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TPlain.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range;
+
+public class TPlain {
+    public int toInt() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TSuper.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TSuper.java
new file mode 100644
index 0000000..c8cbc0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/TSuper.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+package dot.junit.opcodes.invoke_direct_range;
+
+/**
+ * @author fjost
+ *
+ */
+public class TSuper {
+    public int val;
+    public int toInt() {
+        return 5;
+    }
+
+    public int toInt(float v) {
+        return (int)v;
+    }
+
+    public int testArgsOrder(int a, int b) {
+        return a/b;
+    }
+
+    public native int toIntNative();
+
+    public static int toIntStatic() {
+        return 5;
+    }
+
+    protected int toIntP() {
+        return 5;
+    }
+
+    private int toIntPvt() {
+        return 5;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
new file mode 100644
index 0000000..1682c68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_12;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_13;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_16;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_2;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_21;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_6;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_7;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_8;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_9;
+
+public class Test_invoke_direct_range extends DxTestCase {
+
+    /**
+     * @title private method call
+     */
+    public void testN2() {
+        T_invoke_direct_range_2 t = new T_invoke_direct_range_2();
+        assertEquals(345, t.run());
+    }
+
+
+    /**
+     * @title Check that new frame is created by invoke_direct_range
+     */
+    public void testN7() {
+        T_invoke_direct_range_21 t = new T_invoke_direct_range_21();
+        assertEquals(1, t.run());
+    }
+
+
+
+    /**
+     * @title objref is null
+     */
+    public void testE3() {
+        T_invoke_direct_range_8 t = new T_invoke_direct_range_8();
+        try {
+            assertEquals(5, t.run());
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE5() {
+        T_invoke_direct_range_9 t = new T_invoke_direct_range_9();
+        try {
+            assertEquals(5, t.run());
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-direct may not be used to invoke &lt;clinit&gt;
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B4
+     * @title invoke-direct target must be in self or superclass
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_6
+        //@uses dot.junit.opcodes.invoke_direct_range.TSuper
+        try {
+            new T_invoke_direct_range_6();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title int is passed instead of obj ref
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B9
+     * @title number of arguments passed to method
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing protected method
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_25
+        //@uses dot.junit.opcodes.invoke_direct_range.TPlain
+        //@uses dot.junit.opcodes.invoke_direct_range.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_25");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B5
+     * @title  Superclass' method call
+     */
+    public void testVFE11() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_25
+        //@uses dot.junit.opcodes.invoke_direct_range.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE13() {
+        try {
+            new T_invoke_direct_range_7().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE14() {
+        try {
+            new T_invoke_direct_range_16().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke static method. Java throws IncompatibleClassChangeError
+     * on first access but Dalvik throws VerifyError on class loading.
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of superclass. Java throws IllegalAccessError
+     * on first access but Dalvik throws VerifyError on class loading.
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_12
+        //@uses dot.junit.opcodes.invoke_direct_range.TSuper
+        try {
+            new T_invoke_direct_range_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke abstract method
+     */
+    public void testVFE17() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_13
+        //@uses dot.junit.opcodes.invoke_direct_range.TAbstract
+        try {
+            new T_invoke_direct_range_13().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B5
+     * @title An instance initializer must only be invoked on an uninitialized instance.
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B8
+     * @title attempt to access inherited instance field before <init> is called
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_18
+        //@uses dot.junit.opcodes.invoke_direct_range.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title attempt to invoke interface method
+     */
+    public void testVFE20() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_26");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE21() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_27");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d
new file mode 100644
index 0000000..7123eb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_1.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_1
+.super dot/junit/opcodes/invoke_direct_range/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/TSuper/toInt()I
+       move-result v1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java
new file mode 100644
index 0000000..243b923
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+import dot.junit.opcodes.invoke_direct_range.TSuper;
+
+public class T_invoke_direct_range_1 extends TSuper {
+
+    public int run() {
+        return super.toInt();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d
new file mode 100644
index 0000000..2dcf576
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_10.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v0, 1222
+       invoke-direct/range {v0}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d
new file mode 100644
index 0000000..772fc10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_11.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_11/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
+.method private static toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
new file mode 100644
index 0000000..a107ac3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_12.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_12
+.super dot/junit/opcodes/invoke_direct_range/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/toIntPvt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java
new file mode 100644
index 0000000..e01b4f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_12 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d
new file mode 100644
index 0000000..830c367
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_13.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_13
+.super dot/junit/opcodes/invoke_direct_range/TAbstract
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TAbstract/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/TAbstract/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java
new file mode 100644
index 0000000..39c9977
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_13 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d
new file mode 100644
index 0000000..a59d5ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_14.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       const v4, 50
+       const v5, 25
+       move-object v3, v6
+       invoke-direct/range {v3..v4}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d
new file mode 100644
index 0000000..343eafd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_15.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v3}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d
new file mode 100644
index 0000000..82b85d8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_16.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16/toInt()F
+       
+       const/4 v1, 0
+       return v1
+.end method
+
+
+.method private toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java
new file mode 100644
index 0000000..c593d95
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_16 {
+    public int run() {
+        return 0;
+    }
+
+    private int toInt() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d
new file mode 100644
index 0000000..add1dc9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_17.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       new-instance v0, java/lang/String
+       invoke-direct/range {v0} java/lang/String/<init>()V
+         invoke-direct/range {v0} java/lang/String/<init>()V
+       return-void       
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d
new file mode 100644
index 0000000..3922d1b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_18.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_18
+.super dot/junit/opcodes/invoke_direct_range/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       const v0, 0
+       iput v0, v1, dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_18.val I
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d
new file mode 100644
index 0000000..3d4e23c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_2.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java
new file mode 100644
index 0000000..09fa293
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_2 {
+
+    public int run() {
+        return getInt();
+    }
+
+    private int getInt() {
+        return 345;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d
new file mode 100644
index 0000000..234de66
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_21.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct/range {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       const v4, 50
+       const v5, 25
+         move-object v3, v6
+       invoke-direct/range {v3..v5}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java
new file mode 100644
index 0000000..537d238
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_21 {
+
+    
+    private int test(int a, int b) {
+        int i = 999;
+        int j = 888;
+        int k = 777;
+        return a / b;
+    }
+    
+    public int run() {
+        int i = 111;
+        int j = 222;
+        int k = 333;
+        test(50, 25);
+        
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d
new file mode 100644
index 0000000..31a24c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_24.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_24
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test(II)I
+.limit regs 7
+       const v0, 999
+       const v1, 888
+       const v2, 777
+       
+       div-int v4, v5, v6
+       
+       return v4
+.end method
+
+.method public run()I
+.limit regs 7
+       const v0, 111
+       const v1, 222
+       const v2, 333
+       
+       
+       const-wide v4, 50
+          move-object v3, v6
+       invoke-direct {v3..v5}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24/test(II)I
+       move-result v3
+       
+       const v4, 2
+       if-ne v3, v4, Label30
+       
+       const v4, 111
+       if-ne v0, v4, Label30
+       
+       const v4, 222
+       if-ne v1, v4, Label30
+       
+       const v4, 333
+       if-ne v2, v4, Label30
+
+       const v0, 1       
+       return v0
+Label30:
+        const v0, 0
+        return v0
+        
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d
new file mode 100644
index 0000000..6c2334e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_25.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_25
+.super dot/junit/opcodes/invoke_direct_range/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/<init>()V
+       return-void
+.end method
+
+.method private test()V
+    return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_direct_range/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct_range/TPlain/<init>()V
+
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25/test()V
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d
new file mode 100644
index 0000000..6160fe5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_direct_range.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_direct_range.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_direct_range.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_direct_range_26.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_26
+.super dot/junit/opcodes/invoke_direct_range/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_direct_range/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-direct/range {v7}, dot/junit/opcodes/invoke_direct_range/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d
new file mode 100644
index 0000000..1073241
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_27.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_27
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test()V
+    return-void
+.end method
+
+.method public static run()V
+.limit regs 3
+
+       new-instance v0, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27
+       
+       invoke-direct/range {v0}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27/test()V
+       
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d
new file mode 100644
index 0000000..056f2c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_3.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh
new file mode 100644
index 0000000..9772f88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh
@@ -0,0 +1,287 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c60753cb
+    CB 53 07 C6 
+// parsed: offset 12, len 20: signature           : 556e...6eba
+    55 6E A2 8D 60 66 C0 56 70 4C 6B 33 11 26 64 F4 F4 94 6E BA 
+// parsed: offset 32, len 4: file_size           : 612
+    64 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 488 (0x0001e8)
+    E8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 364
+    6C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 324 (0x000144) "<init>"
+    44 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 332 (0x00014c) "I"
+    4C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 335 (0x00014f) "Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;"
+    4F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 402 (0x000192) "Ljava/lang/Object;"
+    92 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 422 (0x0001a6) "T_invoke_direct_range_3.java"
+    A6 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 452 (0x0001c4) "V"
+    C4 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 455 (0x0001c7) "getInt"
+    C7 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 463 (0x0001cf) "run"
+    CF 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "getInt"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [3] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_invoke_direct_range_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 468 (0x0001d4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 D4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_3.<init>"
+    // parsed: offset 248, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_3.getInt"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: const/16 v1, #int 345 // #0x159
+            13 01 59 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// CODE_ITEM for "dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_3.run"
+    // parsed: offset 296, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 298, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 300, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 302, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 304, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 308, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 312, len 6: |0000: invoke-direct/range {v2..v2}, Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;.getInt:()I // method@0001
+//@mod            76 01 01 00 02 00 
+            76 01 01 01 02 00 
+        // parsed: offset 318, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 320, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 322, len 2: PADDING
+    00 00 
+// parsed: offset 324, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 332, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 335, len 67: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;"
+    41 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 5F 72 61 6E 67 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 5F 72 61 6E 67 65 5F 33 3B 00 
+// parsed: offset 402, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 422, len 30: TYPE_STRING_DATA_ITEM [4] "T_invoke_direct_range_3.java"
+    1C 54 5F 69 6E 76 6F 6B 65 5F 64 69 72 65 63 74 5F 72 61 6E 67 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 452, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 455, len 8: TYPE_STRING_DATA_ITEM [6] "getInt"
+    06 67 65 74 49 6E 74 00 
+// parsed: offset 463, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3;"
+    // parsed: offset 468, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 469, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 470, len 1: direct_methods_size: 2
+        02 
+    // parsed: offset 471, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 472, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 473, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 476, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+        // method [1]:
+            // parsed: offset 478, len 1: method_idx_diff: 1 (method_idx: 1 "getInt")
+                01 
+            // parsed: offset 479, len 1: access_flags: 0x000002 (PRIVATE)
+                02 
+            // parsed: offset 480, len 2: code_off: 272 (0x000110)
+                90 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 482, len 1: method_idx_diff: 2 (method_idx: 2 "run")
+                02 
+            // parsed: offset 483, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 484, len 2: code_off: 296 (0x000128)
+                A8 02 
+// parsed: offset 486, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 488, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 492, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 504, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 516, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 528, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 540, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 04 00 00 00 B8 00 00 00 
+    // parsed: offset 552, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 564, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 03 00 00 00 F8 00 00 00 
+    // parsed: offset 576, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 324 (0x000144)
+        02 20 00 00 08 00 00 00 44 01 00 00 
+    // parsed: offset 588, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 20 00 00 01 00 00 00 D4 01 00 00 
+    // parsed: offset 600, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 488 (0x0001e8)
+        00 10 00 00 01 00 00 00 E8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d
new file mode 100644
index 0000000..a7aeae9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_4.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_4
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+    invoke-direct/range {v0}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4/<clinit>()V
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d
new file mode 100644
index 0000000..4ec85bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_5.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d
new file mode 100644
index 0000000..cda9caf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d
@@ -0,0 +1,27 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_6.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V    
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/toIntPvt()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java
new file mode 100644
index 0000000..b1e3a6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_6 {
+    public T_invoke_direct_range_6() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d
new file mode 100644
index 0000000..f0254f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_7.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7/toInt()I
+       const v0, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java
new file mode 100644
index 0000000..f68ed92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_7 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d
new file mode 100644
index 0000000..946c65f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_8.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/4 v1, 0
+       invoke-direct/range {v1}, dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_8/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method private toInt()I
+.limit regs 1
+    const v0, 0
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java
new file mode 100644
index 0000000..bde2e71
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_8 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d
new file mode 100644
index 0000000..567bd84
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_direct_range_9.java
+.class public dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-direct/range {v2}, dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_9/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method private native toInt()I
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java
new file mode 100644
index 0000000..db73113
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_9 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITest.java
new file mode 100644
index 0000000..79917a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface;
+
+public interface ITest {
+    public void doit();
+    public void doit(int i);
+    public void doitNative();
+    public int test(int a);
+    public int testArgsOrder(int a, int b);
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImpl.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImpl.java
new file mode 100644
index 0000000..cf0c0c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface;
+
+public class ITestImpl implements ITest {
+    public void doit() {
+        // impl
+    }
+
+    public void doit(int i) {
+        //
+    }
+
+    public native void doitNative();
+
+    public int test(int a) {
+        if (a == 999) return 195;
+        return 0;
+    }
+
+    public int testArgsOrder(int a, int b) {
+        return a / b;
+    }
+
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java
new file mode 100644
index 0000000..af7a36029
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface;
+
+
+public abstract class ITestImplAbstract implements ITest {
+    abstract public void doit();
+    abstract public void doit(int i);
+    public native void doitNative();
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
new file mode 100644
index 0000000..377cc58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_1;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_11;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_12;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_13;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_14;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_16;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_18;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_20;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_21;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_3;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_4;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_5;
+import dot.junit.opcodes.invoke_interface.d.T_invoke_interface_7;
+
+public class Test_invoke_interface extends DxTestCase {
+
+    /**
+     * @title invoke interface method
+     */
+    public void testN1() {
+        T_invoke_interface_1 t = new T_invoke_interface_1();
+        assertEquals(0, t.run("aa", "aa"));
+        assertEquals(-1, t.run("aa", "bb"));
+        assertEquals(1, t.run("bb", "aa"));
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_interface and
+     * arguments are passed to method
+     */
+    public void testN2() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_14
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        T_invoke_interface_14 t = new T_invoke_interface_14();
+        ITestImpl impl = new ITestImpl();
+        assertEquals(1, t.run(impl));
+    }
+
+
+
+    /**
+     * @title objref is null
+     */
+    public void testE3() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_3
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        try {
+            new T_invoke_interface_3(null);
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title object doesn't implement interface
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_11
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        T_invoke_interface_11 t = new T_invoke_interface_11();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE5() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_12
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        T_invoke_interface_12 t = new T_invoke_interface_12();
+        ITestImpl impl = new ITestImpl();
+        try {
+            t.run(impl);
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE6() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_13
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        //@uses dot.junit.opcodes.invoke_interface.ITestImplAbstract
+        T_invoke_interface_13 t = new T_invoke_interface_13();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A16
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface.d.T_invoke_interface_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A16
+     * @title The referenced method_id must belong to an interface (not a class).
+     */
+    public void testVFE2() {
+        try {
+            new T_invoke_interface_4().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            new T_invoke_interface_5(new ITestImpl());
+            fail("expected VerifyError");
+        } catch (VerifyError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title int is passed instead of objref
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface.d.T_invoke_interface_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title number of arguments passed to method
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface.d.T_invoke_interface_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-interface may not be used to call <init>.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        //@uses dot.junit.opcodes.invoke_interface.ITestImplAbstract
+        try {
+            new T_invoke_interface_18().run(new ITestImpl());
+            fail("expected InstantiationError");
+        } catch (InstantiationError t) {
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-interface may not be used to call <clinit>.
+     */
+    public void testVFE11() {
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            new T_invoke_interface_20().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            new T_invoke_interface_21().run(new ITestImpl());
+            fail("expected VerifyError");
+        } catch (VerifyError t) {
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface.d.T_invoke_interface_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_7
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            new T_invoke_interface_7().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_16
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            new T_invoke_interface_16().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE21() {
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_22
+        //@uses dot.junit.opcodes.invoke_interface.ITest
+        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface.d.T_invoke_interface_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d
new file mode 100644
index 0000000..72c1843
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_1.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface {v6, v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java
new file mode 100644
index 0000000..4e0f991
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+public class T_invoke_interface_1 {
+
+    public int run(Comparable c, Object o) {
+        return c.compareTo(o);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d
new file mode 100644
index 0000000..65ca5f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_10.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+       const v6, 1243
+       invoke-interface {v6, v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d
new file mode 100644
index 0000000..110d826
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_11.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       invoke-interface {v4}, dot/junit/opcodes/invoke_interface/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java
new file mode 100644
index 0000000..1bde245
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+
+public class T_invoke_interface_11 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d
new file mode 100644
index 0000000..c623612
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_12.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 5
+
+       invoke-interface {v4}, dot/junit/opcodes/invoke_interface/ITest/doitNative()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java
new file mode 100644
index 0000000..344e3d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_12 {
+
+    public void run(ITest test) {
+        test.doitNative();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d
new file mode 100644
index 0000000..8d696af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_13.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_13
+.super dot/junit/opcodes/invoke_interface/ITestImplAbstract
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_interface/ITestImplAbstract/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 7
+
+       invoke-interface {v6}, dot/junit/opcodes/invoke_interface/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java
new file mode 100644
index 0000000..d0cd67d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+
+public class T_invoke_interface_13 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d
new file mode 100644
index 0000000..d6ce02a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d
@@ -0,0 +1,54 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_14.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)I
+.limit regs 9
+    const v1, 123
+    const v2, 345
+
+    const v4, 64
+    const v5, 2
+    invoke-interface {v8, v4, v5}, dot/junit/opcodes/invoke_interface/ITest/testArgsOrder(II)I
+    move-result v4
+    const v5, 32
+    if-ne v4, v5, Label0
+
+    const v5, 123
+    if-ne v5, v1, Label0
+
+    const v5, 345
+    if-ne v5, v2, Label0
+
+
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java
new file mode 100644
index 0000000..11a8128
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_14 {
+
+    public int run(ITest test) {
+        int a = 123;
+        int b = 345;
+        if(test.testArgsOrder(64, 2) == 32)
+        {
+            if(a == 123)
+                if(b == 345)
+                    return 1;
+        }
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d
new file mode 100644
index 0000000..3c972ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_16.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 6
+
+       const/high16 v3, 1065353216
+       invoke-interface {v5, v3}, dot/junit/opcodes/invoke_interface/ITest/doit(F)V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java
new file mode 100644
index 0000000..f244ea3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_16 {
+
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
new file mode 100644
index 0000000..f792a3b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_18.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 8
+       new-instance v2, dot/junit/opcodes/invoke_interface/ITestImplAbstract
+       invoke-interface {v2}, dot/junit/opcodes/invoke_interface/ITestImplAbstract/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java
new file mode 100644
index 0000000..b9f9ccc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_18 {
+
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d
new file mode 100644
index 0000000..9c5e86d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_2.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface {v6, v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh
new file mode 100644
index 0000000..d1d1886
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh
@@ -0,0 +1,294 @@
+// Processing 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dex'...
+// Opened 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 0a295956
+    56 59 29 0A 
+// parsed: offset 12, len 20: signature           : 1dee...09a5
+    1D EE 44 4E 27 44 F2 88 7C 13 FE E3 09 B1 55 80 3C 7B 09 A5 
+// parsed: offset 32, len 4: file_size           : 664
+    98 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 528 (0x000210)
+    10 02 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 11
+    0B 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 156 (0x00009c)
+    9C 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 176 (0x0000b0)
+    B0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 244 (0x0000f4)
+    F4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 388
+    84 01 00 00 
+// parsed: offset 108, len 4: data_off            : 276 (0x000114)
+    14 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 342 (0x000156) "<init>"
+    56 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 350 (0x00015e) "I"
+    5E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 353 (0x000161) "IL"
+    61 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 357 (0x000165) "ILL"
+    65 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 362 (0x00016a) "Ldot/junit/opcodes/invoke_interface/d/T_invoke_interface_2;"
+    6A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 423 (0x0001a7) "Ljava/lang/Comparable;"
+    A7 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 447 (0x0001bf) "Ljava/lang/Object;"
+    BF 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 467 (0x0001d3) "T_invoke_interface_2.java"
+    D3 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 494 (0x0001ee) "V"
+    EE 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 497 (0x0001f1) "compareTo"
+    F1 01 00 00 
+// parsed: offset 152, len 4: [10] string_data_off: 508 (0x0001fc) "run"
+    FC 01 00 00 
+
+// type_ids:
+// parsed: offset 156, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 160, len 4: [1] descriptor_idx: 4 (0x000004) "Ldot/junit/opcodes/invoke_interface/d/T_invoke_interface_2;"
+    04 00 00 00 
+// parsed: offset 164, len 4: [2] descriptor_idx: 5 (0x000005) "Ljava/lang/Comparable;"
+    05 00 00 00 
+// parsed: offset 168, len 4: [3] descriptor_idx: 6 (0x000006) "Ljava/lang/Object;"
+    06 00 00 00 
+// parsed: offset 172, len 4: [4] descriptor_idx: 8 (0x000008) "V"
+    08 00 00 00 
+
+// proto_ids:
+// parsed: offset 176, len 12: [0] 
+//     shorty_idx: 3 (0x000003) "ILL"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    03 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 188, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "IL"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 336 (0x000150)
+    02 00 00 00 00 00 00 00 50 01 00 00 
+// parsed: offset 200, len 12: [2] 
+//     shorty_idx: 8 (0x000008) "V"
+//     return_type_idx: 4 (0x000004) "V"
+//     parameters_off: 0 (0x000000)
+    08 00 00 00 04 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 212, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    01 00 02 00 00 00 00 00 
+// parsed: offset 220, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 10 (0x00000a) "run"
+    01 00 00 00 0A 00 00 00 
+// parsed: offset 228, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 9 (0x000009) "compareTo"
+    02 00 01 00 09 00 00 00 
+// parsed: offset 236, len 8: [3] class_idx: 3 (0x000003)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    03 00 02 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 244, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_interface/d/T_invoke_interface_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 3 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 7 "T_invoke_interface_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 513 (0x000201)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 01 02 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_interface.d.T_invoke_interface_2.<init>"
+    // parsed: offset 276, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 278, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 280, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 282, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 284, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 288, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 292, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 298, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_interface.d.T_invoke_interface_2.run"
+    // parsed: offset 300, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 302, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 304, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 306, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 308, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 312, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 316, len 6: |0000: invoke-interface {v6, v7}, Ljava/lang/Comparable;.compareTo:(Ljava/lang/Object;)I // method@0002
+//@mod            72 20 02 00 76 00 
+            72 20 02 01 76 00 
+        // parsed: offset 322, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 324, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 326, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 2
+        02 00 
+    // parsed: offset 334, len 2: type_item [1] type_idx: 3
+        03 00 
+// TYPE_LIST
+    // parsed: offset 336, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 340, len 2: type_item [0] type_idx: 3
+        03 00 
+// parsed: offset 342, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 350, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 353, len 4: TYPE_STRING_DATA_ITEM [2] "IL"
+    02 49 4C 00 
+// parsed: offset 357, len 5: TYPE_STRING_DATA_ITEM [3] "ILL"
+    03 49 4C 4C 00 
+// parsed: offset 362, len 61: TYPE_STRING_DATA_ITEM [4] "Ldot/junit/opcodes/invoke_interface/d/T_invoke_interface_2;"
+    3B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 5F 32 3B 00 
+// parsed: offset 423, len 24: TYPE_STRING_DATA_ITEM [5] "Ljava/lang/Comparable;"
+    16 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6F 6D 70 61 72 61 62 6C 65 3B 00 
+// parsed: offset 447, len 20: TYPE_STRING_DATA_ITEM [6] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 467, len 27: TYPE_STRING_DATA_ITEM [7] "T_invoke_interface_2.java"
+    19 54 5F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 494, len 3: TYPE_STRING_DATA_ITEM [8] "V"
+    01 56 00 
+// parsed: offset 497, len 11: TYPE_STRING_DATA_ITEM [9] "compareTo"
+    09 63 6F 6D 70 61 72 65 54 6F 00 
+// parsed: offset 508, len 5: TYPE_STRING_DATA_ITEM [10] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_interface/d/T_invoke_interface_2;"
+    // parsed: offset 513, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 514, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 515, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 516, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 517, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 518, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 521, len 2: code_off: 276 (0x000114)
+                94 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 523, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 524, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 525, len 2: code_off: 300 (0x00012c)
+                AC 02 
+// parsed: offset 527, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 528, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 532, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 544, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 11
+    //      offset: 112 (0x000070)
+        01 00 00 00 0B 00 00 00 70 00 00 00 
+    // parsed: offset 556, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 156 (0x00009c)
+        02 00 00 00 05 00 00 00 9C 00 00 00 
+    // parsed: offset 568, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 176 (0x0000b0)
+        03 00 00 00 03 00 00 00 B0 00 00 00 
+    // parsed: offset 580, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 212 (0x0000d4)
+        05 00 00 00 04 00 00 00 D4 00 00 00 
+    // parsed: offset 592, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 244 (0x0000f4)
+        06 00 00 00 01 00 00 00 F4 00 00 00 
+    // parsed: offset 604, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 276 (0x000114)
+        01 20 00 00 02 00 00 00 14 01 00 00 
+    // parsed: offset 616, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 2
+    //      offset: 328 (0x000148)
+        01 10 00 00 02 00 00 00 48 01 00 00 
+    // parsed: offset 628, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 11
+    //      offset: 342 (0x000156)
+        02 20 00 00 0B 00 00 00 56 01 00 00 
+    // parsed: offset 640, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 513 (0x000201)
+        00 20 00 00 01 00 00 00 01 02 00 00 
+    // parsed: offset 652, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 528 (0x000210)
+        00 10 00 00 01 00 00 00 10 02 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d
new file mode 100644
index 0000000..c2465e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_20.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_20
+.super java/lang/Object
+
+.field public static i I
+
+.method static <clinit>()V
+.limit regs 2
+Label0:
+       const/4 v1, 0
+       sput v1, dot.junit.opcodes.invoke_interface.d.T_invoke_interface_20.i I
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 5
+
+       invoke-interface {v3}, dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20/<clinit>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java
new file mode 100644
index 0000000..f40b587
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_20 {
+
+    public static int i = 0;
+    
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d
new file mode 100644
index 0000000..f8b0dea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_21.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 9
+
+    const-wide v4, 64
+    invoke-interface {v8, v4, v5}, dot/junit/opcodes/invoke_interface/ITest/testArgsOrder(II)I
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java
new file mode 100644
index 0000000..f777a6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_21 {
+
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d
new file mode 100644
index 0000000..7c27ad2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_22.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_22
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       new-instance v0, dot/junit/opcodes/invoke_interface/ITestImpl
+
+       invoke-interface {v0}, dot/junit/opcodes/invoke_interface/ITest/doit()V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d
new file mode 100644
index 0000000..debf41a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d
@@ -0,0 +1,29 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_3.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_3
+.super java/lang/Object
+
+
+.method public <init>(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 5
+Label0:
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       invoke-interface {v4}, dot/junit/opcodes/invoke_interface/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java
new file mode 100644
index 0000000..8c63c18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_3 {
+
+    public T_invoke_interface_3 (ITest test) {
+        test.doit();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d
new file mode 100644
index 0000000..a8de67b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_4.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-interface {v7}, dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4/test()V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java
new file mode 100644
index 0000000..4f751fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+
+public class T_invoke_interface_4 {
+    public void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d
new file mode 100644
index 0000000..adf7abe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d
@@ -0,0 +1,28 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_5.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_5
+.super java/lang/Object
+
+
+.method public <init>(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 2
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       
+        invoke-interface {}, dot/junit/opcodes/invoke_interface/ITest/doit()V
+       
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java
new file mode 100644
index 0000000..7615134
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+
+public class T_invoke_interface_5 {
+
+    public T_invoke_interface_5(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d
new file mode 100644
index 0000000..c96f200
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_7.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
+.limit regs 5
+
+       invoke-interface {v4}, dot/junit/opcodes/invoke_interface/ITest/doitN()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java
new file mode 100644
index 0000000..b249ded
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface.d;
+
+import dot.junit.opcodes.invoke_interface.ITest;
+
+public class T_invoke_interface_7 {
+
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d
new file mode 100644
index 0000000..8bf956e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_8.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface {v8, v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d
new file mode 100644
index 0000000..2fc4a90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_9.java
+.class public dot.junit.opcodes.invoke_interface.d.T_invoke_interface_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface {v6}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITest.java
new file mode 100644
index 0000000..404787e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range;
+
+public interface ITest {
+    public void doit();
+    public void doit(int i);
+    public void doitNative();
+    public int test(int a);
+    public int testArgsOrder(int a, int b);
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java
new file mode 100644
index 0000000..e1d871a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range;
+
+
+
+public class ITestImpl implements ITest {
+    public void doit() {
+        // impl
+    }
+
+    public void doit(int i) {
+        //
+    }
+
+    public native void doitNative();
+
+    public int test(int a) {
+        if (a == 999) return 195;
+        return 0;
+    }
+
+    public int testArgsOrder(int a, int b) {
+        return a / b;
+    }
+
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java
new file mode 100644
index 0000000..aee0064
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range;
+
+
+public abstract class ITestImplAbstract implements ITest {
+    abstract public void doit();
+    abstract public void doit(int i);
+    public native void doitNative();
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
new file mode 100644
index 0000000..abb4855
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_1;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_21;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_4;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_5;
+import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7;
+
+public class Test_invoke_interface_range extends DxTestCase {
+
+    /**
+     * @title invoke interface method
+     */
+    public void testN1() {
+        T_invoke_interface_range_1 t = new T_invoke_interface_range_1();
+        assertEquals(0, t.run("aa", "aa"));
+        assertEquals(-1, t.run("aa", "bb"));
+        assertEquals(1, t.run("bb", "aa"));
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_interface_range and
+     * arguments are passed to method
+     */
+    public void testN2() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        T_invoke_interface_range_14 t = new T_invoke_interface_range_14();
+        ITestImpl impl = new ITestImpl();
+        assertEquals(1, t.run(impl));
+    }
+
+
+
+    /**
+     * @title objref is null
+     */
+    public void testE3() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        try {
+            new T_invoke_interface_range_3(null);
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title object doesn't implement interface
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        T_invoke_interface_range_11 t = new T_invoke_interface_range_11();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE5() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        T_invoke_interface_range_12 t = new T_invoke_interface_range_12();
+        ITestImpl impl = new ITestImpl();
+        try {
+            t.run(impl);
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE6() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
+        T_invoke_interface_range_13 t = new T_invoke_interface_range_13();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A17
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A17
+     * @title The referenced method_id must belong to an interface (not a class).
+     */
+    public void testVFE2() {
+        try {
+            new T_invoke_interface_range_4().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            new T_invoke_interface_range_5(new ITestImpl());
+            fail("expected VerifyError");
+        } catch (VerifyError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title int is passed instead of objref
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title number of arguments passed to method
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-interface may not be used to call <init>.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
+        try {
+            new T_invoke_interface_range_18().run(new ITestImpl());
+            fail("expected InstantiationError");
+        } catch (InstantiationError t) {
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title invoke-interface may not be used to call <clinit>.
+     */
+    public void testVFE11() {
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            new T_invoke_interface_range_20().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            new T_invoke_interface_range_21().run(new ITestImpl());
+            fail("expected VerifyError");
+        } catch (VerifyError t) {
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            new T_invoke_interface_range_7().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            new T_invoke_interface_range_16().run(new ITestImpl());
+            fail("expected NoSuchMethodError");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE21() {
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22
+        //@uses dot.junit.opcodes.invoke_interface_range.ITest
+        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
+        try {
+            Class.forName("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d
new file mode 100644
index 0000000..70fee02
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_1.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface/range {v6..v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java
new file mode 100644
index 0000000..fa6fd15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+public class T_invoke_interface_range_1 {
+
+    public int run(Comparable c, Object o) {
+        return c.compareTo(o);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d
new file mode 100644
index 0000000..d78f6c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_10.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+       const v6, 1243
+       invoke-interface/range {v6..v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d
new file mode 100644
index 0000000..d0fe868
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_11.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       invoke-interface/range {v4}, dot/junit/opcodes/invoke_interface_range/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java
new file mode 100644
index 0000000..d990613
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+
+public class T_invoke_interface_range_11 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d
new file mode 100644
index 0000000..7463912
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_12.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 5
+
+       invoke-interface/range {v4}, dot/junit/opcodes/invoke_interface_range/ITest/doitNative()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java
new file mode 100644
index 0000000..b5a2167
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_12 {
+
+    public void run(ITest test) {
+        test.doitNative();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d
new file mode 100644
index 0000000..4b0ea65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_13.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13
+.super dot/junit/opcodes/invoke_interface_range/ITestImplAbstract
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_interface_range/ITestImplAbstract/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 7
+
+       invoke-interface/range {v6}, dot/junit/opcodes/invoke_interface_range/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java
new file mode 100644
index 0000000..1d9989b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+
+public class T_invoke_interface_range_13 {
+
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d
new file mode 100644
index 0000000..ce6cd80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d
@@ -0,0 +1,55 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_14.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)I
+.limit regs 9
+    const v1, 123
+    const v2, 345
+
+    const v4, 64
+    const v5, 2
+    move-object v3, v8
+    invoke-interface/range {v3..v5}, dot/junit/opcodes/invoke_interface_range/ITest/testArgsOrder(II)I
+    move-result v4
+    const v5, 32
+    if-ne v4, v5, Label0
+
+    const v5, 123
+    if-ne v5, v1, Label0
+
+    const v5, 345
+    if-ne v5, v2, Label0
+
+
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java
new file mode 100644
index 0000000..ac996f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_14 {
+
+    public int run(ITest test) {
+        int a = 123;
+        int b = 345;
+        if(test.testArgsOrder(64, 2) == 32)
+        {
+            if(a == 123)
+                if(b == 345)
+                    return 1;
+        }
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d
new file mode 100644
index 0000000..2cfcc5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_16.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 6
+
+       const/high16 v3, 1065353216
+       move-object v2, v5
+       invoke-interface/range {v2..v3}, dot/junit/opcodes/invoke_interface_range/ITest/doit(F)V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java
new file mode 100644
index 0000000..ada5988
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_16 {
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
new file mode 100644
index 0000000..0174a71
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_18.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 8
+       new-instance v2, dot/junit/opcodes/invoke_interface_range/ITestImplAbstract
+       invoke-interface/range {v2}, dot/junit/opcodes/invoke_interface_range/ITestImplAbstract/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java
new file mode 100644
index 0000000..5c93b22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_18 {
+
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d
new file mode 100644
index 0000000..cd8bc3e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_2.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface/range {v6..v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh
new file mode 100644
index 0000000..9bc316f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh
@@ -0,0 +1,294 @@
+// Processing 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dex'...
+// Opened 'tools/cts/dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : f75b5e58
+    58 5E 5B F7 
+// parsed: offset 12, len 20: signature           : 8d58...fcad
+    8D 58 41 7D D6 50 6A 07 7B 67 E0 45 7B 76 2A 94 0C A4 FC AD 
+// parsed: offset 32, len 4: file_size           : 684
+    AC 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 548 (0x000224)
+    24 02 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 11
+    0B 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 156 (0x00009c)
+    9C 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 176 (0x0000b0)
+    B0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 244 (0x0000f4)
+    F4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 408
+    98 01 00 00 
+// parsed: offset 108, len 4: data_off            : 276 (0x000114)
+    14 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 342 (0x000156) "<init>"
+    56 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 350 (0x00015e) "I"
+    5E 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 353 (0x000161) "IL"
+    61 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 357 (0x000165) "ILL"
+    65 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 362 (0x00016a) "Ldot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2;"
+    6A 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 435 (0x0001b3) "Ljava/lang/Comparable;"
+    B3 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 459 (0x0001cb) "Ljava/lang/Object;"
+    CB 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 479 (0x0001df) "T_invoke_interface_range_2.java"
+    DF 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 512 (0x000200) "V"
+    00 02 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 515 (0x000203) "compareTo"
+    03 02 00 00 
+// parsed: offset 152, len 4: [10] string_data_off: 526 (0x00020e) "run"
+    0E 02 00 00 
+
+// type_ids:
+// parsed: offset 156, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 160, len 4: [1] descriptor_idx: 4 (0x000004) "Ldot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2;"
+    04 00 00 00 
+// parsed: offset 164, len 4: [2] descriptor_idx: 5 (0x000005) "Ljava/lang/Comparable;"
+    05 00 00 00 
+// parsed: offset 168, len 4: [3] descriptor_idx: 6 (0x000006) "Ljava/lang/Object;"
+    06 00 00 00 
+// parsed: offset 172, len 4: [4] descriptor_idx: 8 (0x000008) "V"
+    08 00 00 00 
+
+// proto_ids:
+// parsed: offset 176, len 12: [0] 
+//     shorty_idx: 3 (0x000003) "ILL"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    03 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 188, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "IL"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 336 (0x000150)
+    02 00 00 00 00 00 00 00 50 01 00 00 
+// parsed: offset 200, len 12: [2] 
+//     shorty_idx: 8 (0x000008) "V"
+//     return_type_idx: 4 (0x000004) "V"
+//     parameters_off: 0 (0x000000)
+    08 00 00 00 04 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 212, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    01 00 02 00 00 00 00 00 
+// parsed: offset 220, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 10 (0x00000a) "run"
+    01 00 00 00 0A 00 00 00 
+// parsed: offset 228, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 9 (0x000009) "compareTo"
+    02 00 01 00 09 00 00 00 
+// parsed: offset 236, len 8: [3] class_idx: 3 (0x000003)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    03 00 02 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 244, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 3 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 7 "T_invoke_interface_range_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 531 (0x000213)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 13 02 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2.<init>"
+    // parsed: offset 276, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 278, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 280, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 282, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 284, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 288, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 292, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 298, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2.run"
+    // parsed: offset 300, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 302, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 304, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 306, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 308, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 312, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 316, len 6: |0000: invoke-interface/range {v6..v7}, Ljava/lang/Comparable;.compareTo:(Ljava/lang/Object;)I // method@0002
+//@mod            78 02 02 00 06 00 
+            78 02 02 01 06 00 
+        // parsed: offset 322, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 324, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 326, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 2
+        02 00 
+    // parsed: offset 334, len 2: type_item [1] type_idx: 3
+        03 00 
+// TYPE_LIST
+    // parsed: offset 336, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 340, len 2: type_item [0] type_idx: 3
+        03 00 
+// parsed: offset 342, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 350, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 353, len 4: TYPE_STRING_DATA_ITEM [2] "IL"
+    02 49 4C 00 
+// parsed: offset 357, len 5: TYPE_STRING_DATA_ITEM [3] "ILL"
+    03 49 4C 4C 00 
+// parsed: offset 362, len 73: TYPE_STRING_DATA_ITEM [4] "Ldot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2;"
+    47 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 5F 72 61 6E 67 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 5F 72 61 6E 67 65 5F 32 3B 00 
+// parsed: offset 435, len 24: TYPE_STRING_DATA_ITEM [5] "Ljava/lang/Comparable;"
+    16 4C 6A 61 76 61 2F 6C 61 6E 67 2F 43 6F 6D 70 61 72 61 62 6C 65 3B 00 
+// parsed: offset 459, len 20: TYPE_STRING_DATA_ITEM [6] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 479, len 33: TYPE_STRING_DATA_ITEM [7] "T_invoke_interface_range_2.java"
+    1F 54 5F 69 6E 76 6F 6B 65 5F 69 6E 74 65 72 66 61 63 65 5F 72 61 6E 67 65 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 512, len 3: TYPE_STRING_DATA_ITEM [8] "V"
+    01 56 00 
+// parsed: offset 515, len 11: TYPE_STRING_DATA_ITEM [9] "compareTo"
+    09 63 6F 6D 70 61 72 65 54 6F 00 
+// parsed: offset 526, len 5: TYPE_STRING_DATA_ITEM [10] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2;"
+    // parsed: offset 531, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 532, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 533, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 534, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 535, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 536, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 539, len 2: code_off: 276 (0x000114)
+                94 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 541, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 542, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 543, len 2: code_off: 300 (0x00012c)
+                AC 02 
+// parsed: offset 545, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 548, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 552, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 564, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 11
+    //      offset: 112 (0x000070)
+        01 00 00 00 0B 00 00 00 70 00 00 00 
+    // parsed: offset 576, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 156 (0x00009c)
+        02 00 00 00 05 00 00 00 9C 00 00 00 
+    // parsed: offset 588, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 176 (0x0000b0)
+        03 00 00 00 03 00 00 00 B0 00 00 00 
+    // parsed: offset 600, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 212 (0x0000d4)
+        05 00 00 00 04 00 00 00 D4 00 00 00 
+    // parsed: offset 612, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 244 (0x0000f4)
+        06 00 00 00 01 00 00 00 F4 00 00 00 
+    // parsed: offset 624, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 276 (0x000114)
+        01 20 00 00 02 00 00 00 14 01 00 00 
+    // parsed: offset 636, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 2
+    //      offset: 328 (0x000148)
+        01 10 00 00 02 00 00 00 48 01 00 00 
+    // parsed: offset 648, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 11
+    //      offset: 342 (0x000156)
+        02 20 00 00 0B 00 00 00 56 01 00 00 
+    // parsed: offset 660, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 531 (0x000213)
+        00 20 00 00 01 00 00 00 13 02 00 00 
+    // parsed: offset 672, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 548 (0x000224)
+        00 10 00 00 01 00 00 00 24 02 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d
new file mode 100644
index 0000000..3dd1bcd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_20.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20
+.super java/lang/Object
+
+.field public static i I
+
+.method static <clinit>()V
+.limit regs 2
+Label0:
+       const/4 v1, 0
+       sput v1, dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20.i I
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 5
+
+       invoke-interface/range {v3}, dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20/<clinit>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java
new file mode 100644
index 0000000..a28964c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_20 {
+
+    public static int i = 0;
+    
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d
new file mode 100644
index 0000000..f8b1b95
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_21.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_21
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 9
+
+    const-wide v4, 64
+    move-object v3, v8
+    invoke-interface/range {v3..v5}, dot/junit/opcodes/invoke_interface_range/ITest/testArgsOrder(II)I
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java
new file mode 100644
index 0000000..b26ae98
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_21 {
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d
new file mode 100644
index 0000000..3b2a521
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_22.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       new-instance v0, dot/junit/opcodes/invoke_interface_range/ITestImpl
+
+       invoke-interface/range {v0}, dot/junit/opcodes/invoke_interface_range/ITest/doit()V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d
new file mode 100644
index 0000000..ca4948d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d
@@ -0,0 +1,29 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_3.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3
+.super java/lang/Object
+
+
+.method public <init>(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 5
+Label0:
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       invoke-interface/range {v4}, dot/junit/opcodes/invoke_interface_range/ITest/doit()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java
new file mode 100644
index 0000000..f39dca5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_3 {
+
+    public T_invoke_interface_range_3 (ITest test) {
+        test.doit();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d
new file mode 100644
index 0000000..8a21324
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_4.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-interface/range {v7}, dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4/test()V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java
new file mode 100644
index 0000000..aa0b9ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+
+public class T_invoke_interface_range_4 {
+    public void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d
new file mode 100644
index 0000000..a0e0905
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d
@@ -0,0 +1,28 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_5.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_5
+.super java/lang/Object
+
+
+.method public <init>(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 2
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       
+        invoke-interface/range {}, dot/junit/opcodes/invoke_interface_range/ITest/doit()V
+       
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java
new file mode 100644
index 0000000..cfbcd8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_5 {
+    public T_invoke_interface_range_5(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d
new file mode 100644
index 0000000..13a63d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_7.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
+.limit regs 5
+
+       invoke-interface/range {v4}, dot/junit/opcodes/invoke_interface_range/ITest/doitN()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java
new file mode 100644
index 0000000..82b6c7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_interface_range.d;
+
+import dot.junit.opcodes.invoke_interface_range.ITest;
+
+public class T_invoke_interface_range_7 {
+    public void run(ITest test) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d
new file mode 100644
index 0000000..f81692c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_8.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       move-object v6, v8
+       invoke-interface/range {v6..v7}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d
new file mode 100644
index 0000000..cd73a85
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_interface_range_9.java
+.class public dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
+.limit regs 8
+
+       invoke-interface/range {v6}, java/lang/Comparable/compareTo(Ljava/lang/Object;)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/TestClass.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/TestClass.java
new file mode 100644
index 0000000..3db9673
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/TestClass.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static;
+
+public class TestClass {
+    
+    public static int test(){
+        return 777;
+    }
+    
+    public static int test1(int i1){
+        int i = i1 + 5;
+        return i;
+    }
+    
+    public static int testArgsOrder(int i1, int i2){
+        int a = 3454;
+        int b = 2302;
+        int i = i1 / i2;
+        return i;
+    }
+    
+    protected static void testProtected() {
+        
+    }
+    
+    
+    private static void testPvt(){
+        
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
new file mode 100644
index 0000000..c7b77aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_1;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_13;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_14;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_15;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_17;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_18;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_19;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_2;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_4;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_5;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_6;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_7;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_8;
+
+
+
+public class Test_invoke_static extends DxTestCase {
+
+    /**
+     * @title Static method from library class Math
+     */
+    public void testN1() {
+        T_invoke_static_1 t = new T_invoke_static_1();
+        assertEquals(1234567, t.run());
+    }
+
+    /**
+     * @title Static method from user class
+     */
+    public void testN2() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_2
+        //@uses dot.junit.opcodes.invoke_static.TestClass
+        T_invoke_static_2 t = new T_invoke_static_2();
+        assertEquals(777, t.run());
+    }
+
+    /**
+     * @title Check that <clinit> is called
+     */
+    public void testN3() {
+        assertEquals(123456789l, T_invoke_static_4.run());
+    }
+
+
+    /**
+     * @title Check that new frame is created by invoke_static and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_15
+        //@uses dot.junit.opcodes.invoke_static.TestClass
+        T_invoke_static_15 t = new T_invoke_static_15();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Static protected method from other class in the same package
+     */
+    public void testN6() {
+        T_invoke_static_18 t = new T_invoke_static_18();
+        assertEquals(888, t.run());
+    }
+
+    /**
+     * @title Native method can't be linked
+     *
+     */
+    public void testE2() {
+        T_invoke_static_6 t = new T_invoke_static_6();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE7() {
+        T_invoke_static_14 t = new T_invoke_static_14();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A13
+     * @title  invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke-static
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method.
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_static
+     */
+    public void testVFE5() {
+        try {
+            new T_invoke_static_19().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call non-static method.
+     */
+    public void testVFE7() {
+         try {
+             new T_invoke_static_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE8() {
+        try {
+            new T_invoke_static_7().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call private method of other class.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_8
+        //@uses dot.junit.opcodes.invoke_static.TestClass
+        try {
+            new T_invoke_static_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_13
+        //@uses dot.junit.opcodes.invoke_static.TestClass
+        try {
+            new T_invoke_static_13().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B12
+     * @title Attempt to call protected method of unrelated class.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_17
+        //@uses dot.junit.opcodes.invoke_static.TestClass
+        try {
+            new T_invoke_static_17().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d
new file mode 100644
index 0000000..04c88aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_1.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java
new file mode 100644
index 0000000..a6b001f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_1 {
+
+    public int run() {
+        return Math.abs(-1234567);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d
new file mode 100644
index 0000000..365afbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_10.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_10
+.super java/lang/Object
+
+
+
+.method static <clinit>()V
+    return-void
+.end method
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/d/T_invoke_static_10/<clinit>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d
new file mode 100644
index 0000000..227b52c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_11.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static {}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d
new file mode 100644
index 0000000..2e78a06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_13.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+
+       invoke-static {v1}, dot/junit/opcodes/invoke_static/TestClass/test1(F)I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java
new file mode 100644
index 0000000..a51532c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d
new file mode 100644
index 0000000..ed2aa2b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d
@@ -0,0 +1,50 @@
+; Copyright (C) 2008 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.
+
+.source TestClassInitError.java
+.class public dot.junit.opcodes.invoke_static.d.TestClassInitError
+.super java/lang/Object
+
+.method static public <clinit>()V
+.limit regs 2
+
+    const v0, 1
+    const v1, 0
+    div-int v0, v0, v1
+.end method
+
+.method static public test()V
+    return-void
+.end method
+
+.source T_invoke_static_14.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/d/TestClassInitError/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java
new file mode 100644
index 0000000..c4efea3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_14 {
+    
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d
new file mode 100644
index 0000000..58bccb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d
@@ -0,0 +1,56 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_15.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 6
+
+    const v1, 123
+    const v2, 345
+
+    const v3, 12
+    const v4, 6
+    
+    invoke-static {v3, v4}, dot/junit/opcodes/invoke_static/TestClass/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 2
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 345
+    if-ne v2, v4, Label0
+
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java
new file mode 100644
index 0000000..0db7ec5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+import dot.junit.opcodes.invoke_static.TestClass;
+
+public class T_invoke_static_15 {
+    
+    public boolean run(){
+        int i = 123;
+        int j = 345;
+        if(TestClass.testArgsOrder(12, 2) == 6)
+            if(i == 123)
+                if(j == 345)
+                    return true;
+        return false;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d
new file mode 100644
index 0000000..883edbe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_16.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static {v3}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d
new file mode 100644
index 0000000..1ce4ed4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_17.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/TestClass/testProtected()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java
new file mode 100644
index 0000000..194ef10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d
new file mode 100644
index 0000000..7332bce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source TestProtected.java
+.class public dot.junit.opcodes.invoke_static.d.TestProtected
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method protected static testP()I
+.limit regs 2
+    const v0, 888
+    return v0
+.end method
+
+
+.source T_invoke_static_18.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/d/TestProtected/testP()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java
new file mode 100644
index 0000000..776b488
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+class TestProtected {
+    static protected int testP() {
+        return 888;
+    }
+}
+
+public class T_invoke_static_18  {
+    
+    public int run() {
+        return TestProtected.testP();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d
new file mode 100644
index 0000000..e94e2a3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_19.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_19
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+
+       invoke-static {}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       const/4 v0, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java
new file mode 100644
index 0000000..1682c92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_19 {
+    
+    public int run() {
+        return Math.abs(-1234567);
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d
new file mode 100644
index 0000000..1c53ad3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_2.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/TestClass/test()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java
new file mode 100644
index 0000000..2e6bfd9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+import dot.junit.opcodes.invoke_static.TestClass;
+
+public class T_invoke_static_2  {
+    
+    public int run() {
+        return TestClass.test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d
new file mode 100644
index 0000000..9ef67a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_20.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const-wide v1, 1
+       invoke-static {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d
new file mode 100644
index 0000000..9a2871f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_static.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_static.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_static.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_static_24.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_24
+.super dot/junit/opcodes/invoke_static/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_static/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-static {v7}, dot/junit/opcodes/invoke_static/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d
new file mode 100644
index 0000000..321761f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_3.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh
new file mode 100644
index 0000000..9c4f6eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh
@@ -0,0 +1,283 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 13655765
+    65 57 65 13 
+// parsed: offset 12, len 20: signature           : a1e9...1ca1
+    A1 E9 92 EC DD 74 44 53 75 44 CF F1 C4 AF EA F3 CB 80 1C A1 
+// parsed: offset 32, len 4: file_size           : 632
+    78 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 496 (0x0001f0)
+    F0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 240 (0x0000f0)
+    F0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 360
+    68 01 00 00 
+// parsed: offset 108, len 4: data_off            : 272 (0x000110)
+    10 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/invoke_static/d/T_invoke_static_3;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 404 (0x000194) "Ljava/lang/Math;"
+    94 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 422 (0x0001a6) "Ljava/lang/Object;"
+    A6 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 442 (0x0001ba) "T_invoke_static_3.java"
+    BA 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 466 (0x0001d2) "V"
+    D2 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 469 (0x0001d5) "abs"
+    D5 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 474 (0x0001da) "run"
+    DA 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/invoke_static/d/T_invoke_static_3;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Math;"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 5 (0x000005) "Ljava/lang/Object;"
+    05 00 00 00 
+// parsed: offset 168, len 4: [4] descriptor_idx: 7 (0x000007) "V"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 172, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 184, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 196, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "V"
+//     return_type_idx: 4 (0x000004) "V"
+//     parameters_off: 0 (0x000000)
+    07 00 00 00 04 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 208, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    01 00 02 00 00 00 00 00 
+// parsed: offset 216, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 9 (0x000009) "run"
+    01 00 00 00 09 00 00 00 
+// parsed: offset 224, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "abs"
+    02 00 01 00 08 00 00 00 
+// parsed: offset 232, len 8: [3] class_idx: 3 (0x000003)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    03 00 02 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 240, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_static/d/T_invoke_static_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 3 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 6 "T_invoke_static_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 479 (0x0001df)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 DF 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_static.d.T_invoke_static_3.<init>"
+    // parsed: offset 272, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 288, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 294, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_static.d.T_invoke_static_3.run"
+    // parsed: offset 296, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 298, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 300, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 302, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 304, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 308, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 312, len 6: |0000: const v1, #float nan // #0xffed2979 int
+            14 01 79 29 ED FF 
+        // parsed: offset 318, len 6: |0003: invoke-static {v1}, Ljava/lang/Math;.abs:(I)I // method@0002
+//@mod            71 10 02 00 01 00 
+        71 10 02 01 01 00
+        // parsed: offset 324, len 2: |0006: move-result v0
+            0A 00 
+        // parsed: offset 326, len 2: |0007: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/invoke_static/d/T_invoke_static_3;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 5F 33 3B 00 
+// parsed: offset 404, len 18: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Math;"
+    10 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4D 61 74 68 3B 00 
+// parsed: offset 422, len 20: TYPE_STRING_DATA_ITEM [5] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 442, len 24: TYPE_STRING_DATA_ITEM [6] "T_invoke_static_3.java"
+    16 54 5F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 466, len 3: TYPE_STRING_DATA_ITEM [7] "V"
+    01 56 00 
+// parsed: offset 469, len 5: TYPE_STRING_DATA_ITEM [8] "abs"
+    03 61 62 73 00 
+// parsed: offset 474, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_static/d/T_invoke_static_3;"
+    // parsed: offset 479, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 480, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 481, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 482, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 483, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 484, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 487, len 2: code_off: 272 (0x000110)
+                90 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 489, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 490, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 491, len 2: code_off: 296 (0x000128)
+                A8 02 
+// parsed: offset 493, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 496, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 500, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 512, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 524, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 152 (0x000098)
+        02 00 00 00 05 00 00 00 98 00 00 00 
+    // parsed: offset 536, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 172 (0x0000ac)
+        03 00 00 00 03 00 00 00 AC 00 00 00 
+    // parsed: offset 548, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 208 (0x0000d0)
+        05 00 00 00 04 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 240 (0x0000f0)
+        06 00 00 00 01 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 272 (0x000110)
+        01 20 00 00 02 00 00 00 10 01 00 00 
+    // parsed: offset 584, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 596, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 334 (0x00014e)
+        02 20 00 00 0A 00 00 00 4E 01 00 00 
+    // parsed: offset 608, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 479 (0x0001df)
+        00 20 00 00 01 00 00 00 DF 01 00 00 
+    // parsed: offset 620, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 496 (0x0001f0)
+        00 10 00 00 01 00 00 00 F0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d
new file mode 100644
index 0000000..4212854
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_4.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_4
+.super java/lang/Object
+
+.field static val J
+
+.method static <clinit>()V
+.limit regs 2
+
+       const-wide/32 v0, 123456789
+       sput-wide v0, dot.junit.opcodes.invoke_static.d.T_invoke_static_4.val J
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 4
+Label0:
+       sget-wide v2, dot.junit.opcodes.invoke_static.d.T_invoke_static_4.val J
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java
new file mode 100644
index 0000000..c9e1dd6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_4 {
+
+    static long val = 123456789l;
+
+    public static long run() {
+        return val;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d
new file mode 100644
index 0000000..a3c8c91
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_5.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const/4 v2, 5
+       invoke-static {v2}, dot/junit/opcodes/invoke_static/d/T_invoke_static_5/test(I)I
+       move-result v0
+       return v0
+.end method
+
+.method public test(I)I
+.limit regs 5
+
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java
new file mode 100644
index 0000000..ace37b8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_5 {
+    public int run() {
+        return 0;
+    }
+    public int test(int i) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d
new file mode 100644
index 0000000..969e499
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_6.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static native test()V
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/d/T_invoke_static_6/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java
new file mode 100644
index 0000000..1cdffb1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_6 {
+
+    public static native void test();
+    
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d
new file mode 100644
index 0000000..b58d3b2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_7.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static test()V
+.limit regs 0
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static {}, dot/junit/opcodes/invoke_static/d/T_invoke_static_7/testN()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java
new file mode 100644
index 0000000..55a2327
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_7 {
+    public static void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d
new file mode 100644
index 0000000..9a4d964
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_8.java
+.class public dot.junit.opcodes.invoke_static.d.T_invoke_static_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+       invoke-static {}, dot/junit/opcodes/invoke_static/TestClass/testPvt()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java
new file mode 100644
index 0000000..61acbc9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/TestClass.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/TestClass.java
new file mode 100644
index 0000000..90f65a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/TestClass.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range;
+
+public class TestClass {
+    
+    public static int test(){
+        return 777;
+    }
+    
+    public static int test1(int i1){
+        int i = i1 + 5;
+        return i;
+    }
+    
+    public static int testArgsOrder(int i1, int i2){
+        int a = 3454;
+        int b = 2302;
+        int i = i1 / i2;
+        return i;
+    }
+    
+    protected static void testProtected() {
+        
+    }
+    
+    
+    private static void testPvt(){
+        
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
new file mode 100644
index 0000000..c62b333
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_1;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_13;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_14;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_15;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_17;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_18;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_19;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_2;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_4;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_5;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_6;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_7;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_8;
+
+
+
+public class Test_invoke_static_range extends DxTestCase {
+
+    /**
+     * @title Static method from library class Math
+     */
+    public void testN1() {
+        T_invoke_static_range_1 t = new T_invoke_static_range_1();
+        assertEquals(1234567, t.run());
+    }
+
+    /**
+     * @title Static method from user class
+     */
+    public void testN2() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_2
+        //@uses dot.junit.opcodes.invoke_static_range.TestClass
+        T_invoke_static_range_2 t = new T_invoke_static_range_2();
+        assertEquals(777, t.run());
+    }
+
+    /**
+     * @title Big number of registers
+     */
+    public void testN3() {
+        assertEquals(1, T_invoke_static_range_4.run());
+    }
+
+
+    /**
+     * @title Check that new frame is created by invoke_static_range and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_15
+        //@uses dot.junit.opcodes.invoke_static_range.TestClass
+        T_invoke_static_range_15 t = new T_invoke_static_range_15();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Static protected method from other class in the same package
+     */
+    public void testN6() {
+        T_invoke_static_range_18 t = new T_invoke_static_range_18();
+        assertEquals(888, t.run());
+    }
+
+    /**
+     * @title Native method can't be linked
+     *
+     */
+    public void testE2() {
+        T_invoke_static_range_6 t = new T_invoke_static_range_6();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE7() {
+        T_invoke_static_range_14 t = new T_invoke_static_range_14();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke_static_range
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_static_range
+     */
+    public void testVFE5() {
+        try {
+            new T_invoke_static_range_19().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call non-static method.
+     */
+    public void testVFE7() {
+         try {
+             new T_invoke_static_range_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call undefined method.
+     */
+    public void testVFE8() {
+        try {
+            new T_invoke_static_range_7().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call private method of other class.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_8
+        //@uses dot.junit.opcodes.invoke_static_range.TestClass
+        try {
+            new T_invoke_static_range_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_13
+        //@uses dot.junit.opcodes.invoke_static_range.TestClass
+        try {
+            new T_invoke_static_range_13().run();
+            fail("expected NoSuchMethodError");
+        } catch (NoSuchMethodError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B12
+     * @title Attempt to call protected method of unrelated class.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_17
+        //@uses dot.junit.opcodes.invoke_static_range.TestClass
+        try {
+            new T_invoke_static_range_17().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d
new file mode 100644
index 0000000..1f8dac7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_1.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static/range {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java
new file mode 100644
index 0000000..e95213e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_1 {
+
+    public int run() {
+        return Math.abs(-1234567);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d
new file mode 100644
index 0000000..994973f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_10.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_10
+.super java/lang/Object
+
+
+
+.method static <clinit>()V
+    return-void
+.end method
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10/<clinit>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d
new file mode 100644
index 0000000..2b7131f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_11.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static/range {}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d
new file mode 100644
index 0000000..dca327b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_13.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+
+       invoke-static/range {v1}, dot/junit/opcodes/invoke_static_range/TestClass/test1(F)I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java
new file mode 100644
index 0000000..b3278c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d
new file mode 100644
index 0000000..e4c1bd3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d
@@ -0,0 +1,50 @@
+; Copyright (C) 2008 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.
+
+.source TestClassInitError.java
+.class public dot.junit.opcodes.invoke_static_range.d.TestClassInitError
+.super java/lang/Object
+
+.method static public <clinit>()V
+.limit regs 2
+
+    const v0, 1
+    const v1, 0
+    div-int v0, v0, v1
+.end method
+
+.method static public test()V
+    return-void
+.end method
+
+.source T_invoke_static_range_14.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/d/TestClassInitError/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java
new file mode 100644
index 0000000..b5b135b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_14 {
+    
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d
new file mode 100644
index 0000000..c56d3c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d
@@ -0,0 +1,56 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_15.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 6
+
+    const v1, 123
+    const v2, 345
+
+    const v3, 12
+    const v4, 6
+    
+    invoke-static/range {v3..v4}, dot/junit/opcodes/invoke_static_range/TestClass/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 2
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 345
+    if-ne v2, v4, Label0
+
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java
new file mode 100644
index 0000000..696de4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+import dot.junit.opcodes.invoke_static_range.TestClass;
+
+public class T_invoke_static_range_15 {
+    
+    public boolean run(){
+        int i = 123;
+        int j = 345;
+        if(TestClass.testArgsOrder(12, 2) == 6)
+            if(i == 123)
+                if(j == 345)
+                    return true;
+        return false;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d
new file mode 100644
index 0000000..c66089b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_16.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static/range {v3}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d
new file mode 100644
index 0000000..b2ce948
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_17.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_17
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/TestClass/testProtected()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java
new file mode 100644
index 0000000..4b020b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d
new file mode 100644
index 0000000..19fec09
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source TestProtected.java
+.class public dot.junit.opcodes.invoke_static_range.d.TestProtected
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method protected static testP()I
+.limit regs 2
+    const v0, 888
+    return v0
+.end method
+
+
+.source T_invoke_static_range_18.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/d/TestProtected/testP()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java
new file mode 100644
index 0000000..34d0098
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+class TestProtected {
+    static protected int testP() {
+        return 888;
+    }
+}
+
+public class T_invoke_static_range_18  {
+    
+    public int run() {
+        return TestProtected.testP();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d
new file mode 100644
index 0000000..051df3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_19.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_19
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+
+       invoke-static/range {}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+       const/4 v0, 0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java
new file mode 100644
index 0000000..204e39a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_19 {
+    
+    public int run() {
+        return Math.abs(-1234567);
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d
new file mode 100644
index 0000000..67e9a13
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_2.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/TestClass/test()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java
new file mode 100644
index 0000000..eb5f3c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+import dot.junit.opcodes.invoke_static_range.TestClass;
+
+public class T_invoke_static_range_2  {
+    
+    public int run() {
+        return TestClass.test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d
new file mode 100644
index 0000000..5819881
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_20.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const-wide v1, 1
+       invoke-static/range {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d
new file mode 100644
index 0000000..6ee8671
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_static_range.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_static_range.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_static_range.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_static_range_24.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_24
+.super dot/junit/opcodes/invoke_static_range/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_static_range/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-static/range {v7}, dot/junit/opcodes/invoke_static_range/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d
new file mode 100644
index 0000000..b3734a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_3.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -1234567
+       invoke-static/range {v1}, java/lang/Math/abs(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh
new file mode 100644
index 0000000..624ef70
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh
@@ -0,0 +1,283 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 4c3e5bf7
+    F7 5B 3E 4C 
+// parsed: offset 12, len 20: signature           : be81...32a4
+    BE 81 F4 E7 AE A6 FA EE 02 66 A3 DF 71 03 38 38 F6 56 32 A4 
+// parsed: offset 32, len 4: file_size           : 648
+    88 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 512 (0x000200)
+    00 02 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 240 (0x0000f0)
+    F0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 376
+    78 01 00 00 
+// parsed: offset 108, len 4: data_off            : 272 (0x000110)
+    10 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 416 (0x0001a0) "Ljava/lang/Math;"
+    A0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 434 (0x0001b2) "Ljava/lang/Object;"
+    B2 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 454 (0x0001c6) "T_invoke_static_range_3.java"
+    C6 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 484 (0x0001e4) "V"
+    E4 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 487 (0x0001e7) "abs"
+    E7 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 492 (0x0001ec) "run"
+    EC 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Math;"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 5 (0x000005) "Ljava/lang/Object;"
+    05 00 00 00 
+// parsed: offset 168, len 4: [4] descriptor_idx: 7 (0x000007) "V"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 172, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 184, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 196, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "V"
+//     return_type_idx: 4 (0x000004) "V"
+//     parameters_off: 0 (0x000000)
+    07 00 00 00 04 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 208, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    01 00 02 00 00 00 00 00 
+// parsed: offset 216, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 9 (0x000009) "run"
+    01 00 00 00 09 00 00 00 
+// parsed: offset 224, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "abs"
+    02 00 01 00 08 00 00 00 
+// parsed: offset 232, len 8: [3] class_idx: 3 (0x000003)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    03 00 02 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 240, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 3 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 6 "T_invoke_static_range_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 497 (0x0001f1)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 F1 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_3.<init>"
+    // parsed: offset 272, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 288, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0003
+            70 10 03 00 01 00 
+        // parsed: offset 294, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_3.run"
+    // parsed: offset 296, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 298, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 300, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 302, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 304, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 308, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 312, len 6: |0000: const v1, #float nan // #0xffed2979 int
+            14 01 79 29 ED FF 
+        // parsed: offset 318, len 6: |0003: invoke-static/range {v1..v1}, Ljava/lang/Math;.abs:(I)I // method@0002
+//@mod            77 01 02 00 01 00 
+            77 01 02 01 01 00 
+        // parsed: offset 324, len 2: |0006: move-result v0
+            0A 00 
+        // parsed: offset 326, len 2: |0007: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 67: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3;"
+    41 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 5F 72 61 6E 67 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 5F 72 61 6E 67 65 5F 33 3B 00 
+// parsed: offset 416, len 18: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Math;"
+    10 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4D 61 74 68 3B 00 
+// parsed: offset 434, len 20: TYPE_STRING_DATA_ITEM [5] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 454, len 30: TYPE_STRING_DATA_ITEM [6] "T_invoke_static_range_3.java"
+    1C 54 5F 69 6E 76 6F 6B 65 5F 73 74 61 74 69 63 5F 72 61 6E 67 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 484, len 3: TYPE_STRING_DATA_ITEM [7] "V"
+    01 56 00 
+// parsed: offset 487, len 5: TYPE_STRING_DATA_ITEM [8] "abs"
+    03 61 62 73 00 
+// parsed: offset 492, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3;"
+    // parsed: offset 497, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 498, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 499, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 500, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 501, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 502, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 505, len 2: code_off: 272 (0x000110)
+                90 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 507, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 508, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 509, len 2: code_off: 296 (0x000128)
+                A8 02 
+// parsed: offset 511, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 512, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 516, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 528, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 540, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 152 (0x000098)
+        02 00 00 00 05 00 00 00 98 00 00 00 
+    // parsed: offset 552, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 172 (0x0000ac)
+        03 00 00 00 03 00 00 00 AC 00 00 00 
+    // parsed: offset 564, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 208 (0x0000d0)
+        05 00 00 00 04 00 00 00 D0 00 00 00 
+    // parsed: offset 576, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 240 (0x0000f0)
+        06 00 00 00 01 00 00 00 F0 00 00 00 
+    // parsed: offset 588, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 272 (0x000110)
+        01 20 00 00 02 00 00 00 10 01 00 00 
+    // parsed: offset 600, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 612, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 334 (0x00014e)
+        02 20 00 00 0A 00 00 00 4E 01 00 00 
+    // parsed: offset 624, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 497 (0x0001f1)
+        00 20 00 00 01 00 00 00 F1 01 00 00 
+    // parsed: offset 636, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 512 (0x000200)
+        00 10 00 00 01 00 00 00 00 02 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d
new file mode 100644
index 0000000..c07542c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d
@@ -0,0 +1,75 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_4.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private static test(IIIIIIIIII)I
+.limit regs 11
+    const v0, 10
+    if-ne v0, v10, Label0
+    const v0, 9
+    if-ne v0, v9, Label0
+    const v0, 8
+    if-ne v0, v8, Label0
+    const v0, 7
+    if-ne v0, v7, Label0
+    const v0, 6
+    if-ne v0, v6, Label0
+    const v0, 5
+    if-ne v0, v5, Label0
+    const v0, 4
+    if-ne v0, v4, Label0
+    const v0, 3
+    if-ne v0, v3, Label0
+    const v0, 2
+    if-ne v0, v2, Label0
+    const v0, 1
+    if-ne v0, v1, Label0
+
+    const v0, 1
+    return v0
+Label0:
+    const v0, 0
+    return v0
+
+.end method
+
+.method public static run()I
+.limit regs 16
+         const v1, 1
+          const v2, 2
+          const v3, 3
+          const v4, 4
+          const v5, 5
+          const v6, 6
+          const v7, 7
+          const v8, 8
+          const v9, 9
+          const v10, 10
+
+       invoke-static/range {v1..v10}, dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_4/test(IIIIIIIIII)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java
new file mode 100644
index 0000000..9f91e19
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_4 {
+
+
+    public static int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d
new file mode 100644
index 0000000..14cbfd6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_5.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const/4 v2, 5
+       invoke-static/range {v2}, dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5/test(I)I
+       move-result v0
+       return v0
+.end method
+
+.method public test(I)I
+.limit regs 5
+
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java
new file mode 100644
index 0000000..3e1f9cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_5 {
+    public int run() {
+        return 0;
+    }
+    public int test(int i) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d
new file mode 100644
index 0000000..a739336
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_6.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static native test()V
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java
new file mode 100644
index 0000000..ab00d04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_6 {
+
+    public static native void test();
+    
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d
new file mode 100644
index 0000000..a7615ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_7.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static test()V
+.limit regs 0
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7/testN()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java
new file mode 100644
index 0000000..5e81cca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_7 {
+    public static void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d
new file mode 100644
index 0000000..a494912
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_static_range_8.java
+.class public dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+       invoke-static/range {}, dot/junit/opcodes/invoke_static_range/TestClass/testPvt()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java
new file mode 100644
index 0000000..ac8e6c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/ATest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/ATest.java
new file mode 100644
index 0000000..af69eaf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/ATest.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super;
+
+public abstract class ATest {
+    
+    public abstract void test();       
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/TestStubs.java
new file mode 100644
index 0000000..28fc156
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/TestStubs.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super;
+
+public class TestStubs {
+    @SuppressWarnings("unused")
+    private void TestStub() {
+        // used by testE6
+    }
+
+    protected void TestStubP() {
+        // used by testE7
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
new file mode 100644
index 0000000..6efac8b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_1;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_10;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_14;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_15;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_17;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_18;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_19;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_2;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_20;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_4;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_5;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_6;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_7;
+
+public class Test_invoke_super extends DxTestCase {
+
+    /**
+     * @title invoke method of superclass
+     */
+    public void testN1() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_1
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        T_invoke_super_1 t = new T_invoke_super_1();
+        assertEquals(5, t.run());
+    }
+
+
+    /**
+     * @title Invoke protected method of superclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_7
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        T_invoke_super_7 t = new T_invoke_super_7();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_super and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_14
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        T_invoke_super_14 t = new T_invoke_super_14();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Recursion of method lookup procedure
+     */
+    public void testN6() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_17
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper2
+        T_invoke_super_17 t = new T_invoke_super_17();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title obj ref is null
+     */
+    public void testE1() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_1
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        T_invoke_super_2 t = new T_invoke_super_2();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE2() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_4
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        T_invoke_super_4 t = new T_invoke_super_4();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_6
+        //@uses dot.junit.opcodes.invoke_super.ATest
+        T_invoke_super_6 t = new T_invoke_super_6();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke-super
+     */
+    public void testVFE3() {
+        try {
+            new T_invoke_super_10().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method.
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_12
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_super
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  protected method
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_22
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super.d.TPlain
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  public method
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_23
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper2
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call static method.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_5
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+         try {
+             new T_invoke_super_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke non-existing method.
+     */
+    public void testVFE12() {
+         try {
+             new T_invoke_super_15().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of other class.
+     */
+    public void testVFE13() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_18
+        //@uses dot.junit.opcodes.invoke_super.TestStubs
+         try {
+             new T_invoke_super_18().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to invoke protected method of unrelated class.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_20
+        //@uses dot.junit.opcodes.invoke_super.TestStubs
+         try {
+             new T_invoke_super_20().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_19
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+         try {
+             new T_invoke_super_19().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title invoke-super shall be used to invoke private methods
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_13
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+         try {
+             Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_13");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_25
+        //@uses dot.junit.opcodes.invoke_super.d.TSuper
+         try {
+             Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_25");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TPlain.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TPlain.d
new file mode 100644
index 0000000..5eaf417
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TPlain.d
@@ -0,0 +1,31 @@
+; Copyright (C) 2008 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.
+
+.source TPlain.java
+.class public dot.junit.opcodes.invoke_super.d.TPlain
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.d
new file mode 100644
index 0000000..c7993b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source TSuper.java
+.class public dot.junit.opcodes.invoke_super.d.TSuper
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+    
+.method public toInt(F)I 
+.limit regs 3
+    int-to-float v0, v2
+    return v0
+.end method
+
+.method public native toIntNative()I    
+.end method
+    
+.method public static toIntStatic()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+  
+.method protected toIntP()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+
+.method private toIntPvt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+    
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 349
+    const v1, 344656
+    div-int v2, v2, v3
+    return v2
+.end method   
+
+.method public testString(Ljava/lang/String;)V
+.limit regs 2
+    return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.java
new file mode 100644
index 0000000..7767485
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class TSuper {
+
+    public int toInt() {
+        return 0;
+    }
+
+    public int toInt(float f) {
+        return 0;
+    }
+
+    public native int toIntNative();
+
+    public static int toIntStatic() {
+        return 0;
+    }
+
+    protected int toIntP() {
+        return 0;
+    }
+
+    private int toIntPvt() {
+        return 0;
+    }
+
+    public int testArgsOrder(int arg1, int arg2) {
+        return 0;
+    }
+
+    public void testString(String s) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper2.d
new file mode 100644
index 0000000..b74842f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/TSuper2.d
@@ -0,0 +1,30 @@
+; Copyright (C) 2008 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.
+
+.source TSuper2.java
+.class public dot.junit.opcodes.invoke_super.d.TSuper2
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public test()I 
+.limit regs 3
+    const v0, 123
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d
new file mode 100644
index 0000000..829c67f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_1.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_1
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 8
+
+       invoke-super {v7}, dot/junit/opcodes/invoke_super/d/T_invoke_super_1/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 777
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java
new file mode 100644
index 0000000..2c1f61d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_1{
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d
new file mode 100644
index 0000000..bc38f2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_10.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_10
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+    invoke-super {v0}, dot.junit.opcodes.invoke_super.d.T_invoke_super_10/<clinit>()V
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java
new file mode 100644
index 0000000..76fff9d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_10 {
+    
+    public void run() {
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d
new file mode 100644
index 0000000..97683ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_11.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-super {v6}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d
new file mode 100644
index 0000000..0b6efa2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_12.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_12
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 8
+
+       invoke-super {v5, v5}, dot.junit.opcodes.invoke_super.d.T_invoke_super_12/testString(Ljava/lang/String;)V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d
new file mode 100644
index 0000000..a030b72
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_13.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_13
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method private toIntPvt()I
+.limit regs 3
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_13/toIntPvt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d
new file mode 100644
index 0000000..b70f691
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d
@@ -0,0 +1,61 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_14.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_14
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 7
+
+    const v1, 123
+    const v2, 659
+    
+    const v3, 300
+    const v4, 3
+
+    invoke-super {v6, v3, v4}, dot/junit/opcodes/invoke_super/d/T_invoke_super_14/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 100
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 659
+    if-ne v2, v4, Label0
+    
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 0
+    return v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java
new file mode 100644
index 0000000..7dfcf14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+    
+public class T_invoke_super_14{
+
+    public boolean run() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d
new file mode 100644
index 0000000..32c2700
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_15.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_15/testN()V
+       return-void
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java
new file mode 100644
index 0000000..f3e30f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d
new file mode 100644
index 0000000..92f6c2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d
@@ -0,0 +1,26 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_16.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+       invoke-super {v2}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d
new file mode 100644
index 0000000..de24bf3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_17.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_17
+.super dot/junit/opcodes/invoke_super/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_17/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java
new file mode 100644
index 0000000..cb68374
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+    
+public class T_invoke_super_17 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d
new file mode 100644
index 0000000..e3d61e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_18.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_super/TestStubs;)V
+.limit regs 5
+
+       invoke-super {v4}, dot/junit/opcodes/invoke_super/TestStubs/TestStub()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java
new file mode 100644
index 0000000..9c256a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+import dot.junit.opcodes.invoke_super.TestStubs;
+
+public class T_invoke_super_18 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d
new file mode 100644
index 0000000..847e743
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_19.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_19
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const/4 v2, 1
+       invoke-super {v3, v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_19/toInt(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java
new file mode 100644
index 0000000..15256e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_19 extends TSuper {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d
new file mode 100644
index 0000000..0144130
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_2.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_2
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 8
+       const v7, 0    
+       invoke-super {v7}, dot/junit/opcodes/invoke_super/d/T_invoke_super_2/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 777
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java
new file mode 100644
index 0000000..474115a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_2{
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d
new file mode 100644
index 0000000..eb429ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_20.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_super/TestStubs;)V
+.limit regs 5
+
+       invoke-super {v4}, dot/junit/opcodes/invoke_super/TestStubs/TestStubP()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java
new file mode 100644
index 0000000..2ae592e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+import dot.junit.opcodes.invoke_super.TestStubs;
+
+public class T_invoke_super_20 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d
new file mode 100644
index 0000000..fbeb8e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_22.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_22
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_super/d/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_super/d/TPlain/<init>()V
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/TSuper/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d
new file mode 100644
index 0000000..f1d2a6f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_23.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_23
+.super dot/junit/opcodes/invoke_super/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_super/d/TSuper
+       invoke-direct {v2}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/TSuper2/test()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d
new file mode 100644
index 0000000..55303d3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_super.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_super.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_super.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_super_24.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_24
+.super dot/junit/opcodes/invoke_super/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-super {v7}, dot/junit/opcodes/invoke_super/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d
new file mode 100644
index 0000000..f6e763c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_25.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_25
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 4
+
+       new-instance v3, dot/junit/opcodes/invoke_super/d/T_invoke_super_25
+       invoke-super {v3}, dot/junit/opcodes/invoke_super/d/T_invoke_super_25/toInt()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d
new file mode 100644
index 0000000..3f80ff8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_4.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_4
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_4/toIntNative()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java
new file mode 100644
index 0000000..316909f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_4 {
+    
+    public native void test();
+
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d
new file mode 100644
index 0000000..af16744
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_5.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_5
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/TSuper/toIntStatic()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java
new file mode 100644
index 0000000..c633829
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_5 extends TSuper {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d
new file mode 100644
index 0000000..94361b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_6.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_6
+.super dot/junit/opcodes/invoke_super/ATest
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/ATest/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/ATest/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java
new file mode 100644
index 0000000..47cf76f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+import dot.junit.opcodes.invoke_super.ATest;
+
+public class T_invoke_super_6 extends ATest {
+    
+    public void test(){
+        int i = 2+5;
+    }
+
+    public void run() {
+        test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d
new file mode 100644
index 0000000..a62a1e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_7.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_7
+.super dot/junit/opcodes/invoke_super/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super {v2}, dot/junit/opcodes/invoke_super/d/T_invoke_super_7/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java
new file mode 100644
index 0000000..2f45567
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super.d;
+
+    
+public class T_invoke_super_7 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d
new file mode 100644
index 0000000..48e9bdd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_8.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-super {v6, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh
new file mode 100644
index 0000000..8501c68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : e6b95367
+    67 53 B9 E6 
+// parsed: offset 12, len 20: signature           : 1f59...4982
+    1F 59 10 CB D9 05 57 DD FD 89 AE 82 F3 40 87 4D 92 7E 49 82 
+// parsed: offset 32, len 4: file_size           : 592
+    50 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 468 (0x0001d4)
+    D4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 344
+    58 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 308 (0x000134) "<init>"
+    34 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 316 (0x00013c) "I"
+    3C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 319 (0x00013f) "Ldot/junit/opcodes/invoke_super/d/TSuper;"
+    3F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 362 (0x00016a) "Ldot/junit/opcodes/invoke_super/d/T_invoke_super_8;"
+    6A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 415 (0x00019f) "T_invoke_super_8.java"
+    9F 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 438 (0x0001b6) "V"
+    B6 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 441 (0x0001b9) "run"
+    B9 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 446 (0x0001be) "toInt"
+    BE 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/invoke_super/d/TSuper;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/invoke_super/d/T_invoke_super_8;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "toInt"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+// parsed: offset 208, len 8: [3] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    02 00 00 00 06 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 2 "Ldot/junit/opcodes/invoke_super/d/T_invoke_super_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ldot/junit/opcodes/invoke_super/d/TSuper;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_invoke_super_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 453 (0x0001c5)
+//     static_values_off: 0 (0x000000)
+    02 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 C5 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_super.d.T_invoke_super_8.<init>"
+    // parsed: offset 248, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 264, len 2: |0000: move-object v0, v2
+            07 20 
+        // parsed: offset 266, len 2: |0001: move-object v1, v0
+            07 01 
+        // parsed: offset 268, len 6: |0002: invoke-direct {v1}, Ldot/junit/opcodes/invoke_super/d/TSuper;.<init>:()V // method@0000
+            70 10 00 00 01 00 
+        // parsed: offset 274, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_super.d.T_invoke_super_8.run"
+    // parsed: offset 276, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 278, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 280, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 282, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 284, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 288, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 292, len 2: |0000: move-object v0, v2
+            07 20 
+        // parsed: offset 294, len 2: |0001: const/4 v1, #int 0 // #0x0
+            12 01 
+        // parsed: offset 296, len 6: |0002: invoke-super {v1}, Ldot/junit/opcodes/invoke_super/d/TSuper;.toInt:()I // method@0001
+//@mod            6F 10 01 00 01 00 
+            6F 10 01 01 01 00 
+        // parsed: offset 302, len 2: |0005: move-result v1
+            0A 01 
+        // parsed: offset 304, len 2: |0006: move v0, v1
+            01 10 
+        // parsed: offset 306, len 2: |0007: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 308, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 316, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 319, len 43: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/invoke_super/d/TSuper;"
+    29 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 2F 64 2F 54 53 75 70 65 72 3B 00 
+// parsed: offset 362, len 53: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/invoke_super/d/T_invoke_super_8;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 5F 38 3B 00 
+// parsed: offset 415, len 23: TYPE_STRING_DATA_ITEM [4] "T_invoke_super_8.java"
+    15 54 5F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 438, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 441, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 446, len 7: TYPE_STRING_DATA_ITEM [7] "toInt"
+    05 74 6F 49 6E 74 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_super/d/T_invoke_super_8;"
+    // parsed: offset 453, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 454, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 455, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 456, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 457, len 1: method_idx_diff: 2 (method_idx: 2 "<init>")
+                02 
+            // parsed: offset 458, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 461, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 463, len 1: method_idx_diff: 3 (method_idx: 3 "run")
+                03 
+            // parsed: offset 464, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 465, len 2: code_off: 276 (0x000114)
+                94 02 
+// parsed: offset 467, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 468, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 472, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 484, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 496, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 508, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 520, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 04 00 00 00 B8 00 00 00 
+    // parsed: offset 532, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 544, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 556, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 308 (0x000134)
+        02 20 00 00 08 00 00 00 34 01 00 00 
+    // parsed: offset 568, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 453 (0x0001c5)
+        00 20 00 00 01 00 00 00 C5 01 00 00 
+    // parsed: offset 580, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 10 00 00 01 00 00 00 D4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d
new file mode 100644
index 0000000..79626b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_9.java
+.class public dot.junit.opcodes.invoke_super.d.T_invoke_super_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-super {v8, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/ATest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/ATest.java
new file mode 100644
index 0000000..20e9c5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/ATest.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range;
+
+public abstract class ATest {
+    
+    public abstract void test();       
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/TestStubs.java
new file mode 100644
index 0000000..22b5046
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/TestStubs.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range;
+
+public class TestStubs {
+    @SuppressWarnings("unused")
+    private void TestStub() {
+        // used by testE6
+    }
+
+    protected void TestStubP() {
+        // used by testE7
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
new file mode 100644
index 0000000..d65b8d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_10;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_14;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_15;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_17;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_18;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_2;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_7;
+
+public class Test_invoke_super_range extends DxTestCase {
+
+    /**
+     * @title invoke method of superclass
+     */
+    public void testN1() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        T_invoke_super_range_1 t = new T_invoke_super_range_1();
+        assertEquals(5, t.run());
+    }
+
+
+    /**
+     * @title Invoke protected method of superclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_7
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        T_invoke_super_range_7 t = new T_invoke_super_range_7();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_super_range and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_14
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        T_invoke_super_range_14 t = new T_invoke_super_range_14();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Recursion of method lookup procedure
+     */
+    public void testN6() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_17
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper2
+        T_invoke_super_range_17 t = new T_invoke_super_range_17();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title obj ref is null
+     */
+    public void testE1() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        T_invoke_super_range_2 t = new T_invoke_super_range_2();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE2() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        T_invoke_super_range_4 t = new T_invoke_super_range_4();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6
+        //@uses dot.junit.opcodes.invoke_super_range.ATest
+        T_invoke_super_range_6 t = new T_invoke_super_range_6();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke-super
+     */
+    public void testVFE3() {
+        try {
+            new T_invoke_super_range_10().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method.
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_12
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_super_range
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  protected method
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_22
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super_range.d.TPlain
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  public method
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_23
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper2
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call static method.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+         try {
+             new T_invoke_super_range_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke non-existing method.
+     */
+    public void testVFE12() {
+         try {
+             new T_invoke_super_range_15().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of other class.
+     */
+    public void testVFE13() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_18
+        //@uses dot.junit.opcodes.invoke_super_range.TestStubs
+         try {
+             new T_invoke_super_range_18().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to invoke protected method of unrelated class.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20
+        //@uses dot.junit.opcodes.invoke_super_range.TestStubs
+         try {
+             new T_invoke_super_range_20().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+         try {
+             new T_invoke_super_range_19().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title invoke-super/range shall be used to invoke private methods
+     */
+    public void testVFE16() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_13
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+         try {
+             Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_13");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_25
+        //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
+         try {
+             Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_25");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d
new file mode 100644
index 0000000..ba9512e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d
@@ -0,0 +1,31 @@
+; Copyright (C) 2008 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.
+
+.source TPlain.java
+.class public dot.junit.opcodes.invoke_super_range.d.TPlain
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d
new file mode 100644
index 0000000..e9d0ff1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source TSuper.java
+.class public dot.junit.opcodes.invoke_super_range.d.TSuper
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+    
+.method public toInt(F)I 
+.limit regs 3
+    int-to-float v0, v2
+    return v0
+.end method
+
+.method public native toIntNative()I    
+.end method
+    
+.method public static toIntStatic()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+  
+.method protected toIntP()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+
+.method private toIntPvt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+    
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 349
+    const v1, 344656
+    div-int v2, v2, v3
+    return v2
+.end method   
+
+.method public testString(Ljava/lang/String;)V
+.limit regs 2
+    return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java
new file mode 100644
index 0000000..004b573
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class TSuper {
+
+    public int toInt() {
+        return 0;
+    }
+
+    public int toInt(float f) {
+        return 0;
+    }
+
+    public native int toIntNative();
+
+    public static int toIntStatic() {
+        return 0;
+    }
+
+    protected int toIntP() {
+        return 0;
+    }
+
+    private int toIntPvt() {
+        return 0;
+    }
+
+    public int testArgsOrder(int arg1, int arg2) {
+        return 0;
+    }
+
+    public void testString(String s) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d
new file mode 100644
index 0000000..90baf5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d
@@ -0,0 +1,30 @@
+; Copyright (C) 2008 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.
+
+.source TSuper2.java
+.class public dot.junit.opcodes.invoke_super_range.d.TSuper2
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public test()I 
+.limit regs 3
+    const v0, 123
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d
new file mode 100644
index 0000000..4181eed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_1.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 8
+
+       invoke-super/range {v7}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 777
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java
new file mode 100644
index 0000000..0844d80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_1{
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d
new file mode 100644
index 0000000..baca689
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_10.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_10
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+    invoke-super/range {v0}, dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_10/<clinit>()V
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java
new file mode 100644
index 0000000..3ff5490
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_10 {
+    
+    public void run() {
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d
new file mode 100644
index 0000000..7cc537c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_11.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-super/range {v6}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d
new file mode 100644
index 0000000..38cd7d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_12.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_12
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 8
+       move-object v4, v5
+       invoke-super/range {v4..v5}, dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_12/testString(Ljava/lang/String;)V
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d
new file mode 100644
index 0000000..d177e76
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_13.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_13
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method private toIntPvt()I
+.limit regs 3
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13/toIntPvt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d
new file mode 100644
index 0000000..c90b576
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d
@@ -0,0 +1,61 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_14.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_14
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 7
+
+    const v1, 123
+    const v2, 659
+    
+    const v4, 300
+    const v5, 3
+    move-object v3, v6
+    invoke-super/range {v3..v5}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 100
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 659
+    if-ne v2, v4, Label0
+    
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 0
+    return v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java
new file mode 100644
index 0000000..32af085
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+    
+public class T_invoke_super_range_14{
+
+    public boolean run() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d
new file mode 100644
index 0000000..7c57710
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_15.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15/testN()V
+       return-void
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java
new file mode 100644
index 0000000..dfd335a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_15 extends TSuper {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d
new file mode 100644
index 0000000..90d9a21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d
@@ -0,0 +1,26 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_16.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+       invoke-super/range {v2}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d
new file mode 100644
index 0000000..962adb5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_17.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_17
+.super dot/junit/opcodes/invoke_super_range/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java
new file mode 100644
index 0000000..5d87c2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+    
+public class T_invoke_super_range_17 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d
new file mode 100644
index 0000000..709fad6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_18.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_super_range/TestStubs;)V
+.limit regs 5
+
+       invoke-super/range {v4}, dot/junit/opcodes/invoke_super_range/TestStubs/TestStub()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java
new file mode 100644
index 0000000..fec68ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+import dot.junit.opcodes.invoke_super_range.TestStubs;
+
+public class T_invoke_super_range_18 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d
new file mode 100644
index 0000000..d30cc05
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_19.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       move-object v0, v3
+       const/4 v1, 1
+       invoke-super/range {v0, v1}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19/toInt(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java
new file mode 100644
index 0000000..d359454
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+
+public class T_invoke_super_range_19 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d
new file mode 100644
index 0000000..b8c9051
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_2.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_2
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 8
+       const v7, 0    
+       invoke-super/range {v7}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2/toInt()I
+
+       move-result v0
+       return v0
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 777
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java
new file mode 100644
index 0000000..c9a5f0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_2{
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d
new file mode 100644
index 0000000..7ea46f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_20.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_super_range/TestStubs;)V
+.limit regs 5
+
+       invoke-super/range {v4}, dot/junit/opcodes/invoke_super_range/TestStubs/TestStubP()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java
new file mode 100644
index 0000000..2e9724c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+import dot.junit.opcodes.invoke_super_range.TestStubs;
+
+public class T_invoke_super_range_20 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d
new file mode 100644
index 0000000..efe22e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_22.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_22
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_super_range/d/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_super_range/d/TPlain/<init>()V
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/TSuper/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d
new file mode 100644
index 0000000..5877042
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_23.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_23
+.super dot/junit/opcodes/invoke_super_range/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_super_range/d/TSuper
+       invoke-direct {v2}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/TSuper2/test()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d
new file mode 100644
index 0000000..dcc399d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d
@@ -0,0 +1,58 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_super_range.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+; =====================================
+
+.source TTestInterfaceImpl.java
+.class public dot.junit.opcodes.invoke_super_range.d.TTestInterfaceImpl
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_super_range.d.TTestInterface
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+; =====================================
+
+.source T_invoke_super_range_24.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24
+.super dot/junit/opcodes/invoke_super_range/d/TTestInterfaceImpl
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TTestInterfaceImpl/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       invoke-super/range {v7}, dot/junit/opcodes/invoke_super_range/d/TTestInterface/test()V
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d
new file mode 100644
index 0000000..1a9d17a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_25.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_25
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 4
+
+       new-instance v3, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25
+       invoke-super/range {v3}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25/toInt()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d
new file mode 100644
index 0000000..eb1a1f5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_4.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4/toIntNative()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java
new file mode 100644
index 0000000..d9b6b9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_4 {
+    
+    public native void test();
+
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d
new file mode 100644
index 0000000..bf38cab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_5.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/TSuper/toIntStatic()I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java
new file mode 100644
index 0000000..aa448e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_5 extends TSuper {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d
new file mode 100644
index 0000000..bb9161c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_6.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6
+.super dot/junit/opcodes/invoke_super_range/ATest
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/ATest/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/ATest/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java
new file mode 100644
index 0000000..64229eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+import dot.junit.opcodes.invoke_super_range.ATest;
+
+public class T_invoke_super_range_6 extends ATest {
+    
+    public void test(){
+        int i = 2+5;
+    }
+
+    public void run() {
+        test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d
new file mode 100644
index 0000000..f170aac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_7.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_7
+.super dot/junit/opcodes/invoke_super_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_super_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-super/range {v2}, dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java
new file mode 100644
index 0000000..d09e351
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_super_range.d;
+
+    
+public class T_invoke_super_range_7 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d
new file mode 100644
index 0000000..ed4d3ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_8.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+     
+       invoke-super/range {v6..v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh
new file mode 100644
index 0000000..3b8efa1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh
@@ -0,0 +1,288 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 677c55cc
+    CC 55 7C 67 
+// parsed: offset 12, len 20: signature           : c17c...13a7
+    C1 7C 21 3E 4F CA 1A 28 AD C6 6A 29 3E DE 7A A7 DC B7 13 A7 
+// parsed: offset 32, len 4: file_size           : 636
+    7C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 500 (0x0001f4)
+    F4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 236 (0x0000ec)
+    EC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 368
+    70 01 00 00 
+// parsed: offset 108, len 4: data_off            : 268 (0x00010c)
+    0C 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 336 (0x000150) "<init>"
+    50 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 344 (0x000158) "Ldot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8;"
+    58 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 409 (0x000199) "Ljava/lang/Object;"
+    99 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 429 (0x0001ad) "T_invoke_super_range_8.java"
+    AD 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 458 (0x0001ca) "V"
+    CA 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 461 (0x0001cd) "Z"
+    CD 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 464 (0x0001d0) "ZL"
+    D0 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 468 (0x0001d4) "ZLL"
+    D4 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 473 (0x0001d9) "equals"
+    D9 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 481 (0x0001e1) "run"
+    E1 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8;"
+    01 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "ZL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 320 (0x000140)
+    06 00 00 00 03 00 00 00 40 01 00 00 
+// parsed: offset 192, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "ZLL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 328 (0x000148)
+    07 00 00 00 03 00 00 00 48 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 204, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 212, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 2 (0x000002) name_idx: 9 (0x000009) "run"
+    00 00 02 00 09 00 00 00 
+// parsed: offset 220, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 228, len 8: [3] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "equals"
+    01 00 01 00 08 00 00 00 
+
+// class_defs:
+// parsed: offset 236, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_invoke_super_range_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 486 (0x0001e6)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 E6 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_8.<init>"
+    // parsed: offset 268, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 284, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 01 00 
+        // parsed: offset 290, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_8.run"
+    // parsed: offset 292, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 294, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 296, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 298, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 300, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 304, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 308, len 6: |0000: invoke-super/range {v6..v7}, Ljava/lang/Object;.equals:(Ljava/lang/Object;)Z // method@0003
+//@mod            75 02 03 00 06 00 
+            75 02 03 01 06 00 
+        // parsed: offset 314, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 316, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 318, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 320, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 324, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 326, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 1
+        01 00 
+    // parsed: offset 334, len 2: type_item [1] type_idx: 1
+        01 00 
+// parsed: offset 336, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 344, len 65: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8;"
+    3F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 5F 72 61 6E 67 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 5F 72 61 6E 67 65 5F 38 3B 00 
+// parsed: offset 409, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 429, len 29: TYPE_STRING_DATA_ITEM [3] "T_invoke_super_range_8.java"
+    1B 54 5F 69 6E 76 6F 6B 65 5F 73 75 70 65 72 5F 72 61 6E 67 65 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 458, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 461, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 464, len 4: TYPE_STRING_DATA_ITEM [6] "ZL"
+    02 5A 4C 00 
+// parsed: offset 468, len 5: TYPE_STRING_DATA_ITEM [7] "ZLL"
+    03 5A 4C 4C 00 
+// parsed: offset 473, len 8: TYPE_STRING_DATA_ITEM [8] "equals"
+    06 65 71 75 61 6C 73 00 
+// parsed: offset 481, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8;"
+    // parsed: offset 486, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 487, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 488, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 489, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 490, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 491, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 494, len 2: code_off: 268 (0x00010c)
+                8C 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 496, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 497, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 498, len 2: code_off: 292 (0x000124)
+                A4 02 
+// map_list:
+    // parsed: offset 500, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 504, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 516, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 528, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 152 (0x000098)
+        02 00 00 00 04 00 00 00 98 00 00 00 
+    // parsed: offset 540, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 03 00 00 00 A8 00 00 00 
+    // parsed: offset 552, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 204 (0x0000cc)
+        05 00 00 00 04 00 00 00 CC 00 00 00 
+    // parsed: offset 564, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 236 (0x0000ec)
+        06 00 00 00 01 00 00 00 EC 00 00 00 
+    // parsed: offset 576, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 268 (0x00010c)
+        01 20 00 00 02 00 00 00 0C 01 00 00 
+    // parsed: offset 588, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 2
+    //      offset: 320 (0x000140)
+        01 10 00 00 02 00 00 00 40 01 00 00 
+    // parsed: offset 600, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 336 (0x000150)
+        02 20 00 00 0A 00 00 00 50 01 00 00 
+    // parsed: offset 612, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 486 (0x0001e6)
+        00 20 00 00 01 00 00 00 E6 01 00 00 
+    // parsed: offset 624, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 500 (0x0001f4)
+        00 10 00 00 01 00 00 00 F4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d
new file mode 100644
index 0000000..e97d513
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_super_range_9.java
+.class public dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-super/range {v7..v8}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/ATest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/ATest.java
new file mode 100644
index 0000000..f102992
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/ATest.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual;
+
+public abstract class ATest {
+    
+    public abstract void test();       
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/TestStubs.java
new file mode 100644
index 0000000..e495f54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/TestStubs.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual;
+
+public class TestStubs {
+    @SuppressWarnings("unused")
+    private void TestStub() {
+        // used by testE6
+    }
+
+    protected void TestStubP() {
+        // used by testE7
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
new file mode 100644
index 0000000..6e41ec1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_1;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_10;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_14;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_15;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_17;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_18;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_19;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_20;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_4;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_5;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_6;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_7;
+
+public class Test_invoke_virtual extends DxTestCase {
+
+    /**
+     * @title invoke virtual method
+     */
+    public void testN1() {
+        T_invoke_virtual_1 t = new T_invoke_virtual_1();
+        int a = 1;
+        String sa = "a" + a;
+        String sb = "a1";
+        assertTrue(t.run(sa, sb));
+        assertFalse(t.run(t, sa));
+        assertFalse(t.run(sb, t));
+    }
+
+    /**
+     * @title Invoke protected method of superclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_7
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+        T_invoke_virtual_7 t = new T_invoke_virtual_7();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_virtual and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_14
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+        T_invoke_virtual_14 t = new T_invoke_virtual_14();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Recursion of method lookup procedure
+     */
+    public void testN6() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_17
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+        T_invoke_virtual_17 t = new T_invoke_virtual_17();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE1() {
+        T_invoke_virtual_1 t = new T_invoke_virtual_1();
+        String s = "s";
+        try {
+            t.run(null, s);
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE2() {
+        T_invoke_virtual_4 t = new T_invoke_virtual_4();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_6
+        //@uses dot.junit.opcodes.invoke_virtual.ATest
+        T_invoke_virtual_6 t = new T_invoke_virtual_6();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke-virtual
+     */
+    public void testVFE3() {
+        try {
+            new T_invoke_virtual_10().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_virtual
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  protected method
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_22
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+        //@uses dot.junit.opcodes.invoke_virtual.d.TPlain
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  public method
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_23
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper2
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call static method.
+     */
+    public void testVFE10() {
+         try {
+             new T_invoke_virtual_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke non-existing method.
+     */
+    public void testVFE12() {
+         try {
+             new T_invoke_virtual_15().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of other class.
+     */
+    public void testVFE13() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_18
+        //@uses dot.junit.opcodes.invoke_virtual.TestStubs
+         try {
+             new T_invoke_virtual_18().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to invoke protected method of unrelated class.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_20
+        //@uses dot.junit.opcodes.invoke_virtual.TestStubs
+         try {
+             new T_invoke_virtual_20().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_19
+        //@uses dot.junit.opcodes.invoke_virtual.d.TSuper
+         try {
+             new T_invoke_virtual_19().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title invoke-virtual shall be used to invoke private methods
+     */
+    public void testVFE16() {
+         try {
+             Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_13");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A13
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE19() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_25");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d
new file mode 100644
index 0000000..f0328ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d
@@ -0,0 +1,31 @@
+; Copyright (C) 2008 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.
+
+.source TPlain.java
+.class public dot.junit.opcodes.invoke_virtual.d.TPlain
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d
new file mode 100644
index 0000000..3b7a591
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d
@@ -0,0 +1,67 @@
+; Copyright (C) 2008 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.
+
+.source TSuper.java
+.class public dot.junit.opcodes.invoke_virtual.d.TSuper
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+    
+.method public toInt(F)I 
+.limit regs 3
+    int-to-float v0, v2
+    return v0
+.end method
+
+.method public native toIntNative()I    
+.end method
+    
+.method public static toIntStatic()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+  
+.method protected toIntP()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+
+.method private toIntPvt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+    
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 349
+    const v1, 344656
+    div-int v2, v2, v3
+    return v2
+.end method   
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java
new file mode 100644
index 0000000..eb0b27a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class TSuper {
+
+    public int toInt() {
+        return 0;
+    }
+
+    public int toInt(float value) {
+        return 0;
+    }
+
+    public native int toIntNative();
+
+    public static int toIntStatic() {
+        return 0;
+    }
+
+    protected int toIntP() {
+        return 0;
+    }
+
+    private int toIntPvt() {
+        return 0;
+    }
+
+    public int testArgsOrder(int arg1, int arg2) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d
new file mode 100644
index 0000000..2137c4c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d
@@ -0,0 +1,30 @@
+; Copyright (C) 2008 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.
+
+.source TSuper2.java
+.class public dot.junit.opcodes.invoke_virtual.d.TSuper2
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public test()I 
+.limit regs 3
+    const v0, 123
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d
new file mode 100644
index 0000000..3192c0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_1.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual {v6, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java
new file mode 100644
index 0000000..f242600
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_1 {
+
+    public boolean run(Object x, Object y) {
+        return x.equals(y);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d
new file mode 100644
index 0000000..2c5c909
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_10.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_10
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+    invoke-virtual {v0}, dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_10/<clinit>()V
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java
new file mode 100644
index 0000000..24898f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_10 {
+    
+    public void run() {
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d
new file mode 100644
index 0000000..68ca8c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_11.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual {v6}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d
new file mode 100644
index 0000000..02d509a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_12.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test(Ljava/lang/String;)V
+    return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual {v5, v7}, dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_12/test(Ljava/lang/String;)V
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d
new file mode 100644
index 0000000..dcf28f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_13.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d
new file mode 100644
index 0000000..743ddf4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d
@@ -0,0 +1,56 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_14.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_14
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 7
+
+    const v1, 123
+    const v2, 659
+    
+    const v3, 300
+    const v4, 3
+
+    invoke-virtual {v6, v3, v4}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 100
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 659
+    if-ne v2, v4, Label0
+    
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java
new file mode 100644
index 0000000..d0a8d40
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+    
+public class T_invoke_virtual_14{
+
+    public boolean run() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d
new file mode 100644
index 0000000..ad196c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_15.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15/testN()V
+       return-void
+.end method
+
+.method public test()V
+.limit regs 1
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java
new file mode 100644
index 0000000..a3d1b68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_15 {
+    public void run() {
+    }
+    public void test() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d
new file mode 100644
index 0000000..0f0ab56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d
@@ -0,0 +1,26 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_16.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+       invoke-virtual {v2}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d
new file mode 100644
index 0000000..da55ec7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_17.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_17
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java
new file mode 100644
index 0000000..918e3b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+    
+public class T_invoke_virtual_17 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d
new file mode 100644
index 0000000..32097da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_18.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_virtual/TestStubs;)V
+.limit regs 5
+       invoke-virtual {v4}, dot/junit/opcodes/invoke_virtual/TestStubs/TestStub()V
+Label6:
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java
new file mode 100644
index 0000000..c6b0c6f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+import dot.junit.opcodes.invoke_virtual.TestStubs;
+
+public class T_invoke_virtual_18 {
+    public void run(TestStubs stub) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d
new file mode 100644
index 0000000..ce0b550
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_19.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_19
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const/4 v2, 1
+       invoke-virtual {v3, v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19/toInt(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java
new file mode 100644
index 0000000..36e3515
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_19 extends TSuper {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d
new file mode 100644
index 0000000..f655091
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_20.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_virtual/TestStubs;)V
+.limit regs 5
+Label0:
+
+       invoke-virtual {v4}, dot/junit/opcodes/invoke_virtual/TestStubs/TestStubP()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java
new file mode 100644
index 0000000..0954ddb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+import dot.junit.opcodes.invoke_virtual.TestStubs;
+
+public class T_invoke_virtual_20 {
+    public void run(TestStubs stub) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d
new file mode 100644
index 0000000..135f037
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_22.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_22
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_virtual/d/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_virtual/d/TPlain/<init>()V
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/TSuper/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d
new file mode 100644
index 0000000..071a91f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_23.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_23
+.super dot/junit/opcodes/invoke_virtual/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_virtual/d/TSuper
+       invoke-direct {v2}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/TSuper2/test()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d
new file mode 100644
index 0000000..1804cce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_virtual.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+.source T_invoke_virtual_24.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_24
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_virtual.d.TTestInterface
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       invoke-virtual {v3}, dot/junit/opcodes/invoke_virtual/d/TTestInterface/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d
new file mode 100644
index 0000000..7816b12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_25.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_25
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       new-instance v6, java/lang/Object
+       invoke-virtual {v6, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d
new file mode 100644
index 0000000..5de2f49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_4.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4/test()V
+       return-void
+.end method
+
+.method public native test()V
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java
new file mode 100644
index 0000000..40cc1fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_4 {
+    
+    public native void test();
+
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d
new file mode 100644
index 0000000..6f18698
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_5.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static test()V
+.limit regs 0
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java
new file mode 100644
index 0000000..a2e32f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_5 {
+    public static void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d
new file mode 100644
index 0000000..a3f42ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_6.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_6
+.super dot/junit/opcodes/invoke_virtual/ATest
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/ATest/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/ATest/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java
new file mode 100644
index 0000000..fd8e058
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+import dot.junit.opcodes.invoke_virtual.ATest;
+
+public class T_invoke_virtual_6 extends ATest {
+    
+    public void test(){
+        int i = 2+5;
+    }
+
+    public void run() {
+        test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d
new file mode 100644
index 0000000..2e3a6a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_7.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_7
+.super dot/junit/opcodes/invoke_virtual/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual {v2}, dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java
new file mode 100644
index 0000000..27b16ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual.d;
+
+    
+public class T_invoke_virtual_7 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d
new file mode 100644
index 0000000..c6ef760
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_8.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual {v6, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh
new file mode 100644
index 0000000..a556dba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh
@@ -0,0 +1,288 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a8d05097
+    97 50 D0 A8 
+// parsed: offset 12, len 20: signature           : 6f6c...0043
+    6F 6C D4 68 F7 7B 24 4C 91 C7 92 D9 30 AA 0C 5B EB 08 00 43 
+// parsed: offset 32, len 4: file_size           : 624
+    70 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 488 (0x0001e8)
+    E8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 236 (0x0000ec)
+    EC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 356
+    64 01 00 00 
+// parsed: offset 108, len 4: data_off            : 268 (0x00010c)
+    0C 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 336 (0x000150) "<init>"
+    50 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 344 (0x000158) "Ldot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8;"
+    58 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 401 (0x000191) "Ljava/lang/Object;"
+    91 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 421 (0x0001a5) "T_invoke_virtual_8.java"
+    A5 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 446 (0x0001be) "V"
+    BE 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 449 (0x0001c1) "Z"
+    C1 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 452 (0x0001c4) "ZL"
+    C4 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 456 (0x0001c8) "ZLL"
+    C8 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 461 (0x0001cd) "equals"
+    CD 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 469 (0x0001d5) "run"
+    D5 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8;"
+    01 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "ZL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 320 (0x000140)
+    06 00 00 00 03 00 00 00 40 01 00 00 
+// parsed: offset 192, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "ZLL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 328 (0x000148)
+    07 00 00 00 03 00 00 00 48 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 204, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 212, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 2 (0x000002) name_idx: 9 (0x000009) "run"
+    00 00 02 00 09 00 00 00 
+// parsed: offset 220, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 228, len 8: [3] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "equals"
+    01 00 01 00 08 00 00 00 
+
+// class_defs:
+// parsed: offset 236, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_invoke_virtual_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 474 (0x0001da)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 DA 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_8.<init>"
+    // parsed: offset 268, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 284, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 01 00 
+        // parsed: offset 290, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_8.run"
+    // parsed: offset 292, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 294, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 296, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 298, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 300, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 304, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 308, len 6: |0000: invoke-virtual {v6, v7}, Ljava/lang/Object;.equals:(Ljava/lang/Object;)Z // method@0003
+//@mod            6E 20 03 00 76 00 
+            6E 20 03 01 76 00 
+        // parsed: offset 314, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 316, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 318, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 320, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 324, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 326, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 1
+        01 00 
+    // parsed: offset 334, len 2: type_item [1] type_idx: 1
+        01 00 
+// parsed: offset 336, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 344, len 57: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8;"
+    37 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 5F 38 3B 00 
+// parsed: offset 401, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 421, len 25: TYPE_STRING_DATA_ITEM [3] "T_invoke_virtual_8.java"
+    17 54 5F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 446, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 449, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 452, len 4: TYPE_STRING_DATA_ITEM [6] "ZL"
+    02 5A 4C 00 
+// parsed: offset 456, len 5: TYPE_STRING_DATA_ITEM [7] "ZLL"
+    03 5A 4C 4C 00 
+// parsed: offset 461, len 8: TYPE_STRING_DATA_ITEM [8] "equals"
+    06 65 71 75 61 6C 73 00 
+// parsed: offset 469, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8;"
+    // parsed: offset 474, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 475, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 476, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 477, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 479, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 482, len 2: code_off: 268 (0x00010c)
+                8C 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 484, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 485, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 486, len 2: code_off: 292 (0x000124)
+                A4 02 
+// map_list:
+    // parsed: offset 488, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 492, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 504, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 516, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 152 (0x000098)
+        02 00 00 00 04 00 00 00 98 00 00 00 
+    // parsed: offset 528, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 03 00 00 00 A8 00 00 00 
+    // parsed: offset 540, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 204 (0x0000cc)
+        05 00 00 00 04 00 00 00 CC 00 00 00 
+    // parsed: offset 552, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 236 (0x0000ec)
+        06 00 00 00 01 00 00 00 EC 00 00 00 
+    // parsed: offset 564, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 268 (0x00010c)
+        01 20 00 00 02 00 00 00 0C 01 00 00 
+    // parsed: offset 576, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 2
+    //      offset: 320 (0x000140)
+        01 10 00 00 02 00 00 00 40 01 00 00 
+    // parsed: offset 588, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 336 (0x000150)
+        02 20 00 00 0A 00 00 00 50 01 00 00 
+    // parsed: offset 600, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 474 (0x0001da)
+        00 20 00 00 01 00 00 00 DA 01 00 00 
+    // parsed: offset 612, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 488 (0x0001e8)
+        00 10 00 00 01 00 00 00 E8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d
new file mode 100644
index 0000000..f695913
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_9.java
+.class public dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual {v8, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/ATest.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/ATest.java
new file mode 100644
index 0000000..e6ebd5a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/ATest.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range;
+
+public abstract class ATest {
+    
+    public abstract void test();       
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java
new file mode 100644
index 0000000..d00c43e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range;
+
+public class TestStubs {
+    @SuppressWarnings("unused")
+    private void TestStub() {
+        // used by testE6
+    }
+
+    protected void TestStubP() {
+        // used by testE7
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
new file mode 100644
index 0000000..2368dc3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_1;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_10;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_14;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_15;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_17;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_18;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_19;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_2;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_20;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_4;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_5;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_6;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_7;
+
+public class Test_invoke_virtual_range extends DxTestCase {
+
+    /**
+     * @title invoke virtual method
+     */
+    public void testN1() {
+        T_invoke_virtual_range_1 t = new T_invoke_virtual_range_1();
+        int a = 1;
+        String sa = "a" + a;
+        String sb = "a1";
+        assertTrue(t.run(sa, sb));
+        assertFalse(t.run(t, sa));
+        assertFalse(t.run(sb, t));
+    }
+
+    /**
+     * @title Invoke protected method of superclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_7
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+        T_invoke_virtual_range_7 t = new T_invoke_virtual_range_7();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title Check that new frame is created by invoke_virtual_range and
+     * arguments are passed to method
+     */
+    public void testN5() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_14
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+        T_invoke_virtual_range_14 t = new T_invoke_virtual_range_14();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Recursion of method lookup procedure
+     */
+    public void testN6() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_17
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+        T_invoke_virtual_range_17 t = new T_invoke_virtual_range_17();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title Big number of arguments
+     */
+    public void testN7() {
+        T_invoke_virtual_range_2 t = new T_invoke_virtual_range_2();
+        assertEquals(1, t.run());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE1() {
+        T_invoke_virtual_range_1 t = new T_invoke_virtual_range_1();
+        String s = "s";
+        try {
+            t.run(null, s);
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Native method can't be linked
+     */
+    public void testE2() {
+        T_invoke_virtual_range_4 t = new T_invoke_virtual_range_4();
+        try {
+            t.run();
+            fail("expected UnsatisfiedLinkError");
+        } catch (UnsatisfiedLinkError ule) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Attempt to invoke abstract method
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_6
+        //@uses dot.junit.opcodes.invoke_virtual_range.ATest
+        T_invoke_virtual_range_6 t = new T_invoke_virtual_range_6();
+        try {
+            t.run();
+            fail("expected AbstractMethodError");
+        } catch (AbstractMethodError iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title invalid constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;clinit&gt; may not be called using invoke-virtual
+     */
+    public void testVFE3() {
+        try {
+            new T_invoke_virtual_range_10().run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title number of arguments passed to method
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B9
+     * @title types of arguments passed to method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A15
+     * @title &lt;init&gt; may not be called using invoke_virtual_range
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  protected method
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_22
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TPlain
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B10
+     * @title assignment incompatible references when accessing
+     *                  public method
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_23
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper2
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to call static method.
+     */
+    public void testVFE10() {
+         try {
+             new T_invoke_virtual_range_5().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke non-existing method.
+     */
+    public void testVFE12() {
+         try {
+             new T_invoke_virtual_range_15().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to invoke private method of other class.
+     */
+    public void testVFE13() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_18
+        //@uses dot.junit.opcodes.invoke_virtual_range.TestStubs
+         try {
+             new T_invoke_virtual_range_18().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to invoke protected method of unrelated class.
+     */
+    public void testVFE14() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_20
+        //@uses dot.junit.opcodes.invoke_virtual_range.TestStubs
+         try {
+             new T_invoke_virtual_range_20().run(new TestStubs());
+             fail("expected IllegalAccessError");
+         } catch (IllegalAccessError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Method has different signature.
+     */
+    public void testVFE15() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_19
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.TSuper
+         try {
+             new T_invoke_virtual_range_19().run();
+             fail("expected NoSuchMethodError");
+         } catch (NoSuchMethodError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title invoke-virtual/range shall be used to invoke private methods
+     */
+    public void testVFE16() {
+         try {
+             Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_13");
+             fail("expected a verification exception");
+         } catch (Throwable t) {
+             DxUtil.checkVerifyException(t);
+         }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A14
+     * @title attempt to invoke interface method
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance methods may only be invoked on already initialized instances.
+     */
+    public void testVFE19() {
+        try {
+            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_25");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java
new file mode 100644
index 0000000..14c735e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java
@@ -0,0 +1,7 @@
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class Snippet {
+    public void test() {
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d
new file mode 100644
index 0000000..c39399e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d
@@ -0,0 +1,31 @@
+; Copyright (C) 2008 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.
+
+.source TPlain.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.TPlain
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d
new file mode 100644
index 0000000..7b4d7b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d
@@ -0,0 +1,67 @@
+; Copyright (C) 2008 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.
+
+.source TSuper.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.TSuper
+.super  java/lang/Object
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+
+.method public toInt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+    
+.method public toInt(F)I 
+.limit regs 3
+    int-to-float v0, v2
+    return v0
+.end method
+
+.method public native toIntNative()I    
+.end method
+    
+.method public static toIntStatic()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method
+  
+.method protected toIntP()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+
+.method private toIntPvt()I 
+.limit regs 3
+    const v0, 5
+    return v0
+.end method  
+    
+.method public testArgsOrder(II)I
+.limit regs 4
+    const v0, 349
+    const v1, 344656
+    div-int v2, v2, v3
+    return v2
+.end method   
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d
new file mode 100644
index 0000000..882b227
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d
@@ -0,0 +1,30 @@
+; Copyright (C) 2008 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.
+
+.source TSuper2.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.TSuper2
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public test()I 
+.limit regs 3
+    const v0, 123
+    return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d
new file mode 100644
index 0000000..b7f13d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_1.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual/range {v6..v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java
new file mode 100644
index 0000000..2c49efe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_1 {
+
+    public boolean run(Object x, Object y) {
+        return x.equals(y);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d
new file mode 100644
index 0000000..3f327a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_10.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_10
+.super java/lang/Object
+
+.method static <clinit>()V
+    return-void
+.end method
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 1
+    invoke-virtual/range {v0}, dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_10/<clinit>()V
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java
new file mode 100644
index 0000000..bc32697
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_10 {
+    
+    public void run() {
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d
new file mode 100644
index 0000000..b109ace
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_11.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual/range {v6}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d
new file mode 100644
index 0000000..9b63ef8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_12.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test(Ljava/lang/String;)V
+    return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       move-object v6, v5
+       invoke-virtual/range {v6..v7}, dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_12/test(Ljava/lang/String;)V
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d
new file mode 100644
index 0000000..fd6de25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_13.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private getInt()I
+.limit regs 3
+       const/16 v1, 345
+       return v1
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13/getInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d
new file mode 100644
index 0000000..32cd481
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d
@@ -0,0 +1,57 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_14.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_14
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 7
+
+    const v1, 123
+    const v2, 659
+    
+    const v4, 300
+    const v5, 3
+    move-object v3, v6
+
+    invoke-virtual/range {v3..v5}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14/testArgsOrder(II)I
+
+    move-result v3
+    const v4, 100
+    if-ne v3, v4, Label0
+
+    const v4, 123
+    if-ne v1, v4, Label0
+
+    const v4, 659
+    if-ne v2, v4, Label0
+    
+    const v0, 1
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java
new file mode 100644
index 0000000..c3b8e0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+    
+public class T_invoke_virtual_range_14{
+
+    public boolean run() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d
new file mode 100644
index 0000000..d42643b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_15.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_15
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15/testN()V
+       return-void
+.end method
+
+.method public test()V
+.limit regs 1
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java
new file mode 100644
index 0000000..969a1ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_15 {
+    public void run() {
+    }
+    public void test() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d
new file mode 100644
index 0000000..5a71786
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d
@@ -0,0 +1,26 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_16.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+       invoke-virtual/range {v2}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d
new file mode 100644
index 0000000..173c6bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_17.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_17
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17/toInt()I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java
new file mode 100644
index 0000000..689f741
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+    
+public class T_invoke_virtual_range_17 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d
new file mode 100644
index 0000000..cc11d06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_18.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_18
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_virtual_range/TestStubs;)V
+.limit regs 5
+       invoke-virtual/range {v4}, dot/junit/opcodes/invoke_virtual_range/TestStubs/TestStub()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java
new file mode 100644
index 0000000..8f01c30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+import dot.junit.opcodes.invoke_virtual_range.TestStubs;
+
+public class T_invoke_virtual_range_18 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d
new file mode 100644
index 0000000..704726b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_19.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_19
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       move-object v2, v3
+       const/4 v3, 1
+       invoke-virtual/range {v2..v3}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19/toInt(I)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java
new file mode 100644
index 0000000..fefa96d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+
+public class T_invoke_virtual_range_19 {
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d
new file mode 100644
index 0000000..eac70b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d
@@ -0,0 +1,77 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_2.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test(IIIIIIIIII)I
+.limit regs 11
+    const v0, 10
+    if-ne v0, v10, Label0
+    const v0, 9
+    if-ne v0, v9, Label0
+    const v0, 8
+    if-ne v0, v8, Label0
+    const v0, 7
+    if-ne v0, v7, Label0
+    const v0, 6
+    if-ne v0, v6, Label0
+    const v0, 5
+    if-ne v0, v5, Label0
+    const v0, 4
+    if-ne v0, v4, Label0
+    const v0, 3
+    if-ne v0, v3, Label0
+    const v0, 2
+    if-ne v0, v2, Label0
+    const v0, 1
+    if-ne v0, v1, Label0
+
+    const v0, 1
+    return v0
+Label0:
+    const v0, 0
+    return v0
+
+.end method
+
+.method public run()I
+.limit regs 16
+       move-object v0, v15
+         const v1, 1
+          const v2, 2
+          const v3, 3
+          const v4, 4
+          const v5, 5
+          const v6, 6
+          const v7, 7
+          const v8, 8
+          const v9, 9
+          const v10, 10
+
+       invoke-virtual/range {v0..v10}, dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_2/test(IIIIIIIIII)I
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java
new file mode 100644
index 0000000..bc934f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_2 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d
new file mode 100644
index 0000000..ab7a4cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_20.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_20
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ldot/junit/opcodes/invoke_virtual_range/TestStubs;)V
+.limit regs 5
+Label0:
+
+       invoke-virtual/range {v4}, dot/junit/opcodes/invoke_virtual_range/TestStubs/TestStubP()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java
new file mode 100644
index 0000000..77c639d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+import dot.junit.opcodes.invoke_virtual_range.TestStubs;
+
+public class T_invoke_virtual_range_20 {
+    public void run(TestStubs stubs) {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d
new file mode 100644
index 0000000..6f6fad5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_22.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_22
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_virtual_range/d/TPlain
+       invoke-direct {v2}, dot/junit/opcodes/invoke_virtual_range/d/TPlain/<init>()V
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d
new file mode 100644
index 0000000..cf21428
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_23.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_23
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper2
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper2/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+
+       new-instance v2, dot/junit/opcodes/invoke_virtual_range/d/TSuper
+       invoke-direct {v2}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/TSuper2/test()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d
new file mode 100644
index 0000000..9e2022f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source TTestInterface.java
+.interface public dot.junit.opcodes.invoke_virtual_range.d.TTestInterface
+
+.method public abstract test()V
+.end method
+
+.source T_invoke_virtual_range_24.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_24
+.super java/lang/Object
+.implements dot.junit.opcodes.invoke_virtual_range.d.TTestInterface
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public test()V
+    return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       invoke-virtual/range {v3}, dot/junit/opcodes/invoke_virtual_range/d/TTestInterface/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d
new file mode 100644
index 0000000..1d39236
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_25.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_25
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+
+       new-instance v6, java/lang/Object
+       invoke-virtual/range {v6, v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d
new file mode 100644
index 0000000..f68a194
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_4.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4/test()V
+       return-void
+.end method
+
+.method public native test()V
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java
new file mode 100644
index 0000000..3b6eff0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_4 {
+    
+    public native void test();
+
+    public void run() {
+        test();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d
new file mode 100644
index 0000000..361e00c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_5.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static test()V
+.limit regs 0
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java
new file mode 100644
index 0000000..b14ffb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_5 {
+    public static void test() {
+    }
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d
new file mode 100644
index 0000000..2dcf120
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_6.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_6
+.super dot/junit/opcodes/invoke_virtual_range/ATest
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/ATest/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/ATest/test()V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java
new file mode 100644
index 0000000..52bdea9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+import dot.junit.opcodes.invoke_virtual_range.ATest;
+
+public class T_invoke_virtual_range_6 extends ATest {
+    
+    public void test(){
+        int i = 2+5;
+    }
+
+    public void run() {
+        test();
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d
new file mode 100644
index 0000000..b5c44f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_7.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_7
+.super dot/junit/opcodes/invoke_virtual_range/d/TSuper
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, dot/junit/opcodes/invoke_virtual_range/d/TSuper/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       invoke-virtual/range {v2}, dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7/toIntP()I
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java
new file mode 100644
index 0000000..333e3ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.invoke_virtual_range.d;
+
+    
+public class T_invoke_virtual_range_7 {
+
+    public int run() {
+        return 0;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d
new file mode 100644
index 0000000..e2538f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_8.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual/range {v6..v7}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh
new file mode 100644
index 0000000..390f2a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh
@@ -0,0 +1,290 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a1e659ab
+    AB 59 E6 A1 
+// parsed: offset 12, len 20: signature           : 8e95...8017
+    8E 95 BB E6 C0 B0 72 A9 B2 A8 7C 08 01 0B 76 DC A6 B9 80 17 
+// parsed: offset 32, len 4: file_size           : 644
+    84 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 508 (0x0001fc)
+    FC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 236 (0x0000ec)
+    EC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 376
+    78 01 00 00 
+// parsed: offset 108, len 4: data_off            : 268 (0x00010c)
+    0C 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 336 (0x000150) "<init>"
+    50 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 344 (0x000158) "Ldot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8;"
+    58 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 413 (0x00019d) "Ljava/lang/Object;"
+    9D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 433 (0x0001b1) "T_invoke_virtual_range_8.java"
+    B1 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 464 (0x0001d0) "V"
+    D0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 467 (0x0001d3) "Z"
+    D3 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 470 (0x0001d6) "ZL"
+    D6 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 474 (0x0001da) "ZLL"
+    DA 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 479 (0x0001df) "equals"
+    DF 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 487 (0x0001e7) "run"
+    E7 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8;"
+    01 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "ZL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 320 (0x000140)
+    06 00 00 00 03 00 00 00 40 01 00 00 
+// parsed: offset 192, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "ZLL"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 328 (0x000148)
+    07 00 00 00 03 00 00 00 48 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 204, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 212, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 2 (0x000002) name_idx: 9 (0x000009) "run"
+    00 00 02 00 09 00 00 00 
+// parsed: offset 220, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 228, len 8: [3] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "equals"
+    01 00 01 00 08 00 00 00 
+
+// class_defs:
+// parsed: offset 236, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_invoke_virtual_range_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 492 (0x0001ec)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 EC 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_8.<init>"
+    // parsed: offset 268, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 284, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 01 00 
+        // parsed: offset 290, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_8.run"
+    // parsed: offset 292, len 2: registers_size: 8
+        08 00 
+    // parsed: offset 294, len 2: ins_size: 3
+        03 00 
+    // parsed: offset 296, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 298, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 300, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 304, len 4: insns_size: 5
+        05 00 00 00 
+    // insns:
+        // parsed: offset 308, len 6: |0000: invoke-virtual/range {v6..v7}, Ljava/lang/Object;.equals:(Ljava/lang/Object;)Z // method@0003
+//@mod            74 02 03 00 06 00 
+            74 02 03 01 06 00 
+        // parsed: offset 314, len 2: |0003: move-result v0
+            0A 00 
+        // parsed: offset 316, len 2: |0004: return v0
+            0F 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 318, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 320, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 324, len 2: type_item [0] type_idx: 1
+        01 00 
+// parsed: offset 326, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 2
+        02 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 1
+        01 00 
+    // parsed: offset 334, len 2: type_item [1] type_idx: 1
+        01 00 
+// parsed: offset 336, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 344, len 69: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8;"
+    43 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 5F 72 61 6E 67 65 2F 64 2F 54 5F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 5F 72 61 6E 67 65 5F 38 3B 00 
+// parsed: offset 413, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 433, len 31: TYPE_STRING_DATA_ITEM [3] "T_invoke_virtual_range_8.java"
+    1D 54 5F 69 6E 76 6F 6B 65 5F 76 69 72 74 75 61 6C 5F 72 61 6E 67 65 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 464, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 467, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 470, len 4: TYPE_STRING_DATA_ITEM [6] "ZL"
+    02 5A 4C 00 
+// parsed: offset 474, len 5: TYPE_STRING_DATA_ITEM [7] "ZLL"
+    03 5A 4C 4C 00 
+// parsed: offset 479, len 8: TYPE_STRING_DATA_ITEM [8] "equals"
+    06 65 71 75 61 6C 73 00 
+// parsed: offset 487, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8;"
+    // parsed: offset 492, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 493, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 494, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 495, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 496, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 497, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 500, len 2: code_off: 268 (0x00010c)
+                8C 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 502, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 503, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 504, len 2: code_off: 292 (0x000124)
+                A4 02 
+// parsed: offset 506, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 508, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 512, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 524, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 536, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 152 (0x000098)
+        02 00 00 00 04 00 00 00 98 00 00 00 
+    // parsed: offset 548, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 03 00 00 00 A8 00 00 00 
+    // parsed: offset 560, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 204 (0x0000cc)
+        05 00 00 00 04 00 00 00 CC 00 00 00 
+    // parsed: offset 572, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 236 (0x0000ec)
+        06 00 00 00 01 00 00 00 EC 00 00 00 
+    // parsed: offset 584, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 268 (0x00010c)
+        01 20 00 00 02 00 00 00 0C 01 00 00 
+    // parsed: offset 596, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 2
+    //      offset: 320 (0x000140)
+        01 10 00 00 02 00 00 00 40 01 00 00 
+    // parsed: offset 608, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 336 (0x000150)
+        02 20 00 00 0A 00 00 00 50 01 00 00 
+    // parsed: offset 620, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 492 (0x0001ec)
+        00 20 00 00 01 00 00 00 EC 01 00 00 
+    // parsed: offset 632, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 508 (0x0001fc)
+        00 10 00 00 01 00 00 00 FC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d
new file mode 100644
index 0000000..393f733
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_invoke_virtual_range_9.java
+.class public dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
+.limit regs 8
+
+       invoke-virtual/range {v7..v8}, java/lang/Object/equals(Ljava/lang/Object;)Z
+
+       move-result v0
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/TestStubs.java
new file mode 100644
index 0000000..8ebe9bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput;
+
+public class TestStubs {
+    // used by testVFE9
+    protected int TestStubField = 0;
+    
+    // used by testE5
+    public final int TestStubFieldFinal = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/Test_iput.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/Test_iput.java
new file mode 100644
index 0000000..f69b308
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/Test_iput.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput.d.T_iput_1;
+import dot.junit.opcodes.iput.d.T_iput_10;
+import dot.junit.opcodes.iput.d.T_iput_11;
+import dot.junit.opcodes.iput.d.T_iput_12;
+import dot.junit.opcodes.iput.d.T_iput_13;
+import dot.junit.opcodes.iput.d.T_iput_14;
+import dot.junit.opcodes.iput.d.T_iput_15;
+import dot.junit.opcodes.iput.d.T_iput_17;
+import dot.junit.opcodes.iput.d.T_iput_19;
+import dot.junit.opcodes.iput.d.T_iput_5;
+import dot.junit.opcodes.iput.d.T_iput_7;
+import dot.junit.opcodes.iput.d.T_iput_8;
+import dot.junit.opcodes.iput.d.T_iput_9;
+
+public class Test_iput extends DxTestCase {
+
+    /**
+     * @title type - int
+     */
+    public void testN1() {
+        T_iput_1 t = new T_iput_1();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(1000000, t.st_i1);
+    }
+
+    /**
+     * @title type - float
+     */
+    public void testN2() {
+        T_iput_19 t = new T_iput_19();
+        assertEquals(0.0f, t.st_f1);
+        t.run();
+        assertEquals(3.14f, t.st_f1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN3() {
+        T_iput_12 t = new T_iput_12();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(1000000, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput.d.T_iput_1
+        //@uses dot.junit.opcodes.iput.d.T_iput_14
+        T_iput_14 t = new T_iput_14();
+        assertEquals(0, t.getProtectedField());
+        t.run();
+        assertEquals(1000000, t.getProtectedField());
+    }
+
+    /**
+     * @title Trying to put float into integer field. Dalvik doens't distinguish 32-bits types
+     * internally, so this operation makes no sense but shall not crash the VM.
+     */
+    public void testN6() {
+        T_iput_5 t = new  T_iput_5();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_13 t = new T_iput_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put integer into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double field
+     * with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title Attempt to set static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput.TestStubs
+        //@uses dot.junit.opcodes.iput.d.T_iput_8
+        try {
+            new T_iput_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput.d.T_iput_1
+        //@uses dot.junit.opcodes.iput.d.T_iput_15
+        try {
+            new T_iput_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput shall not work for boolean fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput shall not work for byte fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput.d.T_iput_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testE5() {
+        //@uses dot.junit.opcodes.iput.TestStubs
+        //@uses dot.junit.opcodes.iput.d.T_iput_11
+    	try {
+            new T_iput_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.d
new file mode 100644
index 0000000..062a5f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_1.java
+.class public dot.junit.opcodes.iput.d.T_iput_1
+.super java/lang/Object
+
+.field public  st_i1 I
+.field protected  st_p1 I
+.field private  st_pvt1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()I
+.limit regs 2
+
+       iget v0, v1, dot.junit.opcodes.iput.d.T_iput_1.st_pvt1 I
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_1.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.java
new file mode 100644
index 0000000..b508414
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_1 {
+    public  int st_i1;
+    protected  int st_p1;
+    private  int st_pvt1;
+    
+    public void run() {
+        st_i1 = 1000000;
+    }
+    
+    public  int getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.d
new file mode 100644
index 0000000..782486a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_10.java
+.class public dot.junit.opcodes.iput.d.T_iput_10
+.super java/lang/Object
+
+.field public st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_10.st_i1N I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.java
new file mode 100644
index 0000000..4f630e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.d
new file mode 100644
index 0000000..9fb06de
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_11.java
+.class public dot.junit.opcodes.iput.d.T_iput_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput/TestStubs/<init>()V
+
+       const v1, 1000000
+       iput v1, v0, dot.junit.opcodes.iput.TestStubs.TestStubFieldFinal I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.java
new file mode 100644
index 0000000..9c47bd5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.d
new file mode 100644
index 0000000..73104b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_12.java
+.class public dot.junit.opcodes.iput.d.T_iput_12
+.super java/lang/Object
+
+.field public final st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_12.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.java
new file mode 100644
index 0000000..4fbe9c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_12 {
+    public  int st_i1;
+    
+    public void run() {
+        st_i1 = 1000000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.d
new file mode 100644
index 0000000..3760a4f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_13.java
+.class public dot.junit.opcodes.iput.d.T_iput_13
+.super java/lang/Object
+
+.field public  st_i1 I
+.field protected  st_p1 I
+.field private  st_pvt1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       const v1, 1000000
+       iput v1, v0, dot.junit.opcodes.iput.d.T_iput_13.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.java
new file mode 100644
index 0000000..53423f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_13 {
+    
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.d
new file mode 100644
index 0000000..ba404d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_14.java
+.class public dot.junit.opcodes.iput.d.T_iput_14
+.super dot/junit/opcodes/iput/d/T_iput_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput/d/T_iput_1/<init>()V
+       return-void
+.end method
+
+.method public getProtectedField()I
+.limit regs 2
+
+       iget v0, v1, dot.junit.opcodes.iput.d.T_iput_1.st_p1 I
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_1.st_p1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.java
new file mode 100644
index 0000000..7d7e102
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_14 extends T_iput_1{
+    
+    public void run() {
+        st_p1 = 1000000;
+    }
+    
+    public  int getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.d
new file mode 100644
index 0000000..8864195
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_15.java
+.class public dot.junit.opcodes.iput.d.T_iput_15
+.super dot/junit/opcodes/iput/d/T_iput_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput/d/T_iput_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 12321
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_1.st_pvt1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.java
new file mode 100644
index 0000000..f432d27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.d
new file mode 100644
index 0000000..e0b35ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_17.java
+.class public dot.junit.opcodes.iput.d.T_iput_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_17.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.java
new file mode 100644
index 0000000..0c1bb0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_18.d
new file mode 100644
index 0000000..1ec565d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_18.java
+.class public dot.junit.opcodes.iput.d.T_iput_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.d
new file mode 100644
index 0000000..f7f8997
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_19.java
+.class public dot.junit.opcodes.iput.d.T_iput_19
+.super java/lang/Object
+
+.field public  st_f1 F
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_19.st_f1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.java
new file mode 100644
index 0000000..bf6deee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_19.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_19 {
+    public  float st_f1;
+    
+    
+    public void run() {
+        st_f1 = 3.14f;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_2.d
new file mode 100644
index 0000000..a89c29d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_2.java
+.class public dot.junit.opcodes.iput.d.T_iput_2
+.super java/lang/Object
+
+.field public  st_d1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const-wide v1, 1000000.000000
+       iput v1, v3, dot.junit.opcodes.iput.d.T_iput_2.st_d1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_20.d
new file mode 100644
index 0000000..0161449
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_20.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_20.java
+.class public dot.junit.opcodes.iput.d.T_iput_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 0
+       iput v0, v3, dot.junit.opcodes.iput.d.T_iput_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_21.d
new file mode 100644
index 0000000..f189066
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_21.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_21.java
+.class public dot.junit.opcodes.iput.d.T_iput_21
+.super java/lang/Object
+
+.field public  st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1234    
+       iput v0, v3, dot.junit.opcodes.iput.d.T_iput_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_22.d
new file mode 100644
index 0000000..71b8cdf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_22.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_22.java
+.class public dot.junit.opcodes.iput.d.T_iput_22
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput v0, v3, dot.junit.opcodes.iput.d.T_iput_22.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_23.d
new file mode 100644
index 0000000..e0bf2a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_23.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_23.java
+.class public dot.junit.opcodes.iput.d.T_iput_23
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput v0, v3, dot.junit.opcodes.iput.d.T_iput_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_24.d
new file mode 100644
index 0000000..4e6d187
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_24.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_24.java
+.class public dot.junit.opcodes.iput.d.T_iput_24
+.super java/lang/Object
+
+.field public  st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput v0, v3, dot.junit.opcodes.iput.d.T_iput_24.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.d
new file mode 100644
index 0000000..bdb6b35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_3.java
+.class public dot.junit.opcodes.iput.d.T_iput_3
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1234
+       iput v0, v2, dot.junit.opcodes.iput.d.T_iput_3.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.dfh
new file mode 100644
index 0000000..0474f19
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput/d/T_iput_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput/d/T_iput_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 3bce3c78
+    78 3C CE 3B 
+// parsed: offset 12, len 20: signature           : 15da...0f9b
+    15 DA 79 0D 61 BF 5F C9 34 71 F7 04 83 3D 02 17 E9 5E 0F 9B 
+// parsed: offset 32, len 4: file_size           : 540
+    1C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 404 (0x000194)
+    94 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 304
+    30 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "I"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/iput/d/T_iput_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 336 (0x000150) "Ljava/lang/Object;"
+    50 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 356 (0x000164) "T_iput_3.java"
+    64 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 371 (0x000173) "V"
+    73 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 374 (0x000176) "run"
+    76 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 379 (0x00017b) "st_i1"
+    7B 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iput/d/T_iput_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iput/d/T_iput_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iput_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 386 (0x000182)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 82 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput.d.T_iput_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput.d.T_iput_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x000004d2 int
+            14 00 D2 04 00 00 
+        // parsed: offset 282, len 4: |0003: iput v0, v2, Ldot/junit/opcodes/iput/d/T_iput_3;.st_i1:I // field@0000
+//@mod            59 20 00 00 
+            59 20 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 299, len 37: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iput/d/T_iput_3;"
+    23 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 2F 64 2F 54 5F 69 70 75 74 5F 33 3B 00 
+// parsed: offset 336, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 356, len 15: TYPE_STRING_DATA_ITEM [4] "T_iput_3.java"
+    0D 54 5F 69 70 75 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 371, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 374, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 379, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput/d/T_iput_3;"
+    // parsed: offset 386, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 387, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 388, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 389, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 390, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 391, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 392, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 393, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 396, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 398, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 399, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 400, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 402, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 404, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 408, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 420, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 432, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 444, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 456, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 468, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 480, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 492, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 504, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 516, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 386 (0x000182)
+        00 20 00 00 01 00 00 00 82 01 00 00 
+    // parsed: offset 528, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 404 (0x000194)
+        00 10 00 00 01 00 00 00 94 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_30.d
new file mode 100644
index 0000000..08df316
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_30.java
+.class public dot.junit.opcodes.iput.d.T_iput_30
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput/d/T_iput_30
+    const v1, 0
+    iput v1, v0, dot.junit.opcodes.iput.d.T_iput_30.st_i1 I
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_4.d
new file mode 100644
index 0000000..f324be4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_4.java
+.class public dot.junit.opcodes.iput.d.T_iput_4
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput v3, v2, dot.junit.opcodes.iput.d.T_iput_4.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.d
new file mode 100644
index 0000000..c34dbac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_5.java
+.class public dot.junit.opcodes.iput.d.T_iput_5
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)V
+.limit regs 3
+
+       iput v2, v1, dot.junit.opcodes.iput.d.T_iput_5.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.java
new file mode 100644
index 0000000..6df6a7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_5 {
+    public  int st_i1;
+    
+    public void run(float f) {
+        st_i1 = 1000000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.d
new file mode 100644
index 0000000..af7b003
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_7.java
+.class public dot.junit.opcodes.iput.d.T_iput_7
+.super java/lang/Object
+
+.field public static st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_7.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.java
new file mode 100644
index 0000000..c7407e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.d
new file mode 100644
index 0000000..6c1ed20
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_8.java
+.class public dot.junit.opcodes.iput.d.T_iput_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+      new-instance v0, Ldot/junit/opcodes/iput/TestStubs;
+      invoke-direct {v0}, dot/junit/opcodes/iput/TestStubs/<init>()V
+
+       const v1, 0
+       iput v1, v0, dot.junit.opcodes.iput.TestStubs.TestStubField I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.java
new file mode 100644
index 0000000..264aef0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.d
new file mode 100644
index 0000000..7c7d755
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_9.java
+.class public dot.junit.opcodes.iput.d.T_iput_9
+.super java/lang/Object
+
+.field public st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput v1, v2, dot.junit.opcodes.iput.d.T_iput_9noclass.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.java
new file mode 100644
index 0000000..a3c1695
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_iput_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput.d;
+
+public class T_iput_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_sput_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_sput_3.dfh
new file mode 100644
index 0000000..f7d95ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput/d/T_sput_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput/d/T_sput_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput/d/T_sput_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 07553f66
+    66 3F 55 07 
+// parsed: offset 12, len 20: signature           : 2441...71d9
+    24 41 F7 4C E7 A3 98 B5 AC 67 0E F8 6B D1 13 E3 DD 10 71 D9 
+// parsed: offset 32, len 4: file_size           : 540
+    1C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 404 (0x000194)
+    94 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 304
+    30 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "I"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 336 (0x000150) "Ljava/lang/Object;"
+    50 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 356 (0x000164) "T_sput_3.java"
+    64 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 371 (0x000173) "V"
+    73 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 374 (0x000176) "run"
+    76 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 379 (0x00017b) "st_i1"
+    7B 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sput/d/T_sput_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 386 (0x000182)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 82 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput.d.T_sput_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput.d.T_sput_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x000004d2 int
+            14 00 D2 04 00 00 
+        // parsed: offset 282, len 4: |0003: sput v0, Ldot/junit/opcodes/sput/d/T_sput_3;.st_i1:I // field@0000
+//@mod            67 00 00 00 
+            67 00 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 299, len 37: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    23 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 2F 64 2F 54 5F 73 70 75 74 5F 33 3B 00 
+// parsed: offset 336, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 356, len 15: TYPE_STRING_DATA_ITEM [4] "T_sput_3.java"
+    0D 54 5F 73 70 75 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 371, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 374, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 379, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    // parsed: offset 386, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 387, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 388, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 389, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 390, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 391, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 392, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 393, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 396, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 398, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 399, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 400, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 402, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 404, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 408, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 420, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 432, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 444, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 456, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 468, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 480, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 492, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 504, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 516, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 386 (0x000182)
+        00 20 00 00 01 00 00 00 82 01 00 00 
+    // parsed: offset 528, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 404 (0x000194)
+        00 10 00 00 01 00 00 00 94 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/TestStubs.java
new file mode 100644
index 0000000..07919e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean;
+
+public class TestStubs {
+    // used by testVFE9
+    protected boolean TestStubField = false;
+    
+    // used by testE5
+    public final boolean TestStubFieldFinal = false;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
new file mode 100644
index 0000000..6a2419b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_10;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_11;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_12;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_13;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_14;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_15;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_17;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_7;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_8;
+import dot.junit.opcodes.iput_boolean.d.T_iput_boolean_9;
+
+
+public class Test_iput_boolean extends DxTestCase {
+
+    /**
+     * @title put boolean into field
+     */
+    public void testN1() {
+        T_iput_boolean_1 t = new T_iput_boolean_1();
+        assertEquals(false, t.st_i1);
+        t.run();
+        assertEquals(true, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_iput_boolean_12 t = new T_iput_boolean_12();
+        assertEquals(false, t.st_i1);
+        t.run();
+        assertEquals(true, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_14
+        T_iput_boolean_14 t = new T_iput_boolean_14();
+        assertEquals(false, t.getProtectedField());
+        t.run();
+        assertEquals(true, t.getProtectedField());
+    }
+
+
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_boolean_13 t = new T_iput_boolean_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B14
+     * @title put boolean into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_boolean_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title put value '2' into boolean field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_boolean_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_boolean.TestStubs
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_8
+        try {
+            new T_iput_boolean_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_boolean_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_boolean_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_15
+        try {
+            new T_iput_boolean_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput_boolean shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput_boolean shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput_boolean shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput_boolean shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title iput_boolean shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title iput_boolean shall not work for byte fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.iput_boolean.TestStubs
+        //@uses dot.junit.opcodes.iput_boolean.d.T_iput_boolean_11
+        try {
+            new T_iput_boolean_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d
new file mode 100644
index 0000000..47ee9dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_1.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1
+.super java/lang/Object
+
+.field public  st_i1 Z
+.field protected  st_p1 Z
+.field private  st_pvt1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()Z
+.limit regs 2
+
+       iget-boolean v0, v1, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1.st_pvt1 Z
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1.st_i1 Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java
new file mode 100644
index 0000000..14d2b98
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_1 {
+    public  boolean st_i1;
+    protected  boolean st_p1;
+    private  boolean st_pvt1;
+    
+    public void run() {
+        st_i1 = true;
+    }
+    
+    public  boolean getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d
new file mode 100644
index 0000000..77f762a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_10.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_10
+.super java/lang/Object
+
+.field public st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_10.st_i1N Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java
new file mode 100644
index 0000000..7279fe0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d
new file mode 100644
index 0000000..9f8d148
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_11.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_boolean/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_boolean/TestStubs/<init>()V
+
+       const v1, 1
+       iput-boolean v1, v0, dot.junit.opcodes.iput_boolean.TestStubs.TestStubFieldFinal Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java
new file mode 100644
index 0000000..77de3e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d
new file mode 100644
index 0000000..327fef6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_12.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_12
+.super java/lang/Object
+
+.field public  final st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_12.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java
new file mode 100644
index 0000000..4321bfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_12 {
+    public  boolean st_i1;
+    
+    public void run() {
+        st_i1 = true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d
new file mode 100644
index 0000000..cbe6560
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_13.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_13
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       const v1, 1
+       iput-boolean v1, v0, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_13.st_i1 Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java
new file mode 100644
index 0000000..c523c5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_13 {
+    
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d
new file mode 100644
index 0000000..8a7f23e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_14.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_14
+.super dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()Z
+.limit regs 2
+
+       iget-boolean v0, v1, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1.st_p1 Z
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1.st_p1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java
new file mode 100644
index 0000000..e708762
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_14 extends T_iput_boolean_1{
+    
+    public void run() {
+        st_p1 = true;
+    }
+    
+    public  boolean getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d
new file mode 100644
index 0000000..605fab5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_15.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_15
+.super dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_1.st_pvt1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java
new file mode 100644
index 0000000..893595b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d
new file mode 100644
index 0000000..2d0e858
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_17.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_17.st_i1 Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java
new file mode 100644
index 0000000..c7dbaeb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d
new file mode 100644
index 0000000..5ca6791
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_18.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d
new file mode 100644
index 0000000..aed12db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_19.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_19
+.super java/lang/Object
+
+.field public  st_f1 F
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_19.st_f1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java
new file mode 100644
index 0000000..3828d90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_19 {
+    public  float st_f1;
+    
+    
+    public void run() {
+        st_f1 = 3.14f;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d
new file mode 100644
index 0000000..20ba2cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_2.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_2
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-boolean v0, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_4.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d
new file mode 100644
index 0000000..b7bb68c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_20.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 0    
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d
new file mode 100644
index 0000000..a05e7d9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_21.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_21
+.super java/lang/Object
+
+.field public  st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d
new file mode 100644
index 0000000..5953110
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_22.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_22
+.super java/lang/Object
+
+.field public  st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d
new file mode 100644
index 0000000..3d51bf4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_23.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_23
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d
new file mode 100644
index 0000000..ccd56a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_24.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_24
+.super java/lang/Object
+
+.field public  st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v0, 1    
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_24.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d
new file mode 100644
index 0000000..864852f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_3.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_3
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       iput-boolean v0, v3, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_3.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh
new file mode 100644
index 0000000..971a7eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 77b34b2d
+    2D 4B B3 77 
+// parsed: offset 12, len 20: signature           : 6ffc...5670
+    6F FC D3 2C 6D F3 E5 94 FA 99 F9 FC 05 BD 3A 88 8C CD 56 70 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 328
+    48 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 349 (0x00015d) "Ljava/lang/Object;"
+    5D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 369 (0x000171) "T_iput_boolean_3.java"
+    71 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 392 (0x000188) "V"
+    88 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "Z"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "run"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "st_i1"
+    93 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  type_idx: 3 (0x000003) name_idx: 7 (0x000007) "st_i1"
+    00 00 03 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    00 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_iput_boolean_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_boolean.d.T_iput_boolean_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_boolean.d.T_iput_boolean_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: iput-boolean v0, v3, Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;.st_i1:Z // field@0000
+//@mod            5C 30 00 00 
+            5C 30 00 01
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 53: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 62 6F 6F 6C 65 61 6E 2F 64 2F 54 5F 69 70 75 74 5F 62 6F 6F 6C 65 61 6E 5F 33 3B 00 
+// parsed: offset 349, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 369, len 23: TYPE_STRING_DATA_ITEM [3] "T_iput_boolean_3.java"
+    15 54 5F 69 70 75 74 5F 62 6F 6F 6C 65 61 6E 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 392, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 398, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 403, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_boolean/d/T_iput_boolean_3;"
+    // parsed: offset 410, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 414, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 415, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d
new file mode 100644
index 0000000..f68e154
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_30.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_30
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30
+    const v1, 0
+    iput-boolean v1, v0, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_30.st_i1 Z
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d
new file mode 100644
index 0000000..5b0d440
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_4.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_4
+.super java/lang/Object
+
+.field public  st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-boolean v3, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_4.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
new file mode 100644
index 0000000..29230ed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_6.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6
+.super java/lang/Object
+
+.field public  s Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const v2, 2    
+       iput-boolean v2, v5, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6.s Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d
new file mode 100644
index 0000000..1c26b25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_7.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_7
+.super java/lang/Object
+
+.field public static st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_7.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java
new file mode 100644
index 0000000..c48328e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d
new file mode 100644
index 0000000..ce16612
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_8.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_boolean/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_boolean/TestStubs/<init>()V
+       const v1, 0
+       iput-boolean v1, v0, dot.junit.opcodes.iput_boolean.TestStubs.TestStubField Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java
new file mode 100644
index 0000000..6706b11
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d
new file mode 100644
index 0000000..b740349
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_boolean_9.java
+.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_9
+.super java/lang/Object
+
+.field public st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-boolean v1, v2, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_9noclass.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java
new file mode 100644
index 0000000..86c2fbf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_boolean.d;
+
+public class T_iput_boolean_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/TestStubs.java
new file mode 100644
index 0000000..c8906b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte;
+
+public class TestStubs {
+    // used by testVFE9
+    protected byte TestStubField = 77;
+    
+    // used by testE5
+    public final byte TestStubFieldFinal = 77;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
new file mode 100644
index 0000000..f67e22b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_1;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_10;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_11;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_12;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_13;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_14;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_15;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_17;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_7;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_8;
+import dot.junit.opcodes.iput_byte.d.T_iput_byte_9;
+
+public class Test_iput_byte extends DxTestCase {
+    /**
+     * @title put byte into field
+     */
+    public void testN1() {
+        T_iput_byte_1 t = new T_iput_byte_1();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_iput_byte_12 t = new T_iput_byte_12();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_1
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_14
+        T_iput_byte_14 t = new T_iput_byte_14();
+        assertEquals(0, t.getProtectedField());
+        t.run();
+        assertEquals(77, t.getProtectedField());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_byte_13 t = new T_iput_byte_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put byte into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_byte_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title put value '256' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_byte_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_byte.TestStubs
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_8
+        try {
+            new T_iput_byte_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_byte_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_byte_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_1
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_15
+        try {
+            new T_iput_byte_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput-byte shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-byte shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-byte shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-byte shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-byte shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-byte shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.iput_byte.TestStubs
+        //@uses dot.junit.opcodes.iput_byte.d.T_iput_byte_11
+    	try {
+            new T_iput_byte_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d
new file mode 100644
index 0000000..860157b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_1.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_1
+.super java/lang/Object
+
+.field public  st_i1 B
+.field protected  st_p1 B
+.field private  st_pvt1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()B
+.limit regs 2
+
+       iget-byte v0, v1, dot.junit.opcodes.iput_byte.d.T_iput_byte_1.st_pvt1 B
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_1.st_i1 B
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java
new file mode 100644
index 0000000..d926c18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_1 {
+    public  byte st_i1;
+    protected  byte st_p1;
+    private  byte st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public  byte getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d
new file mode 100644
index 0000000..279b2a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_10.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_10
+.super java/lang/Object
+
+.field public st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_10.st_i1N B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java
new file mode 100644
index 0000000..f7278f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d
new file mode 100644
index 0000000..9c80461
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_11.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_byte/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_byte/TestStubs/<init>()V
+
+       const v1, 1
+       iput-byte v1, v0, dot.junit.opcodes.iput_byte.TestStubs.TestStubFieldFinal B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java
new file mode 100644
index 0000000..a77d3c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d
new file mode 100644
index 0000000..ee0355b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_12.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_12
+.super java/lang/Object
+
+.field public  final st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_12.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java
new file mode 100644
index 0000000..c64063c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_12 {
+    public  byte st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d
new file mode 100644
index 0000000..26cd104
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_13.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_13
+.super java/lang/Object
+
+.field public  st_i1 B
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       const v1, 77
+       iput-byte v1, v0, dot.junit.opcodes.iput_byte.d.T_iput_byte_13.st_i1 B
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java
new file mode 100644
index 0000000..e907164
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_13 {
+    
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d
new file mode 100644
index 0000000..9be11ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_14.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_14
+.super dot/junit/opcodes/iput_byte/d/T_iput_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_byte/d/T_iput_byte_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()B
+.limit regs 2
+
+       iget-byte v0, v1, dot.junit.opcodes.iput_byte.d.T_iput_byte_1.st_p1 B
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_1.st_p1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java
new file mode 100644
index 0000000..e1bcc4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_14 extends T_iput_byte_1{
+    
+    public void run() {
+        st_p1 = 77;
+    }
+    
+    public byte getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d
new file mode 100644
index 0000000..2f14e14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_15.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_15
+.super dot/junit/opcodes/iput_byte/d/T_iput_byte_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_byte/d/T_iput_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_1.st_pvt1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java
new file mode 100644
index 0000000..249926f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d
new file mode 100644
index 0000000..1f8bd94
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_17.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_17.st_i1 B
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java
new file mode 100644
index 0000000..6eca2a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d
new file mode 100644
index 0000000..153aae1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_18.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d
new file mode 100644
index 0000000..3805c5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_2.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_2
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-byte v0, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_4.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d
new file mode 100644
index 0000000..2452e5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_20.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-byte v3, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
new file mode 100644
index 0000000..9f8bd0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_21.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_21
+.super java/lang/Object
+
+.field public  st_s I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_21.st_s I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
new file mode 100644
index 0000000..e0a19be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_22.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_22
+.super java/lang/Object
+
+.field public  st_b I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_22.st_b I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d
new file mode 100644
index 0000000..afae162
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_23.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_23
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d
new file mode 100644
index 0000000..ac31166
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_24.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_24
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d
new file mode 100644
index 0000000..c3a8828
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_3.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_3
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       iput-byte v0, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_3.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh
new file mode 100644
index 0000000..74792e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 6e4345b3
+    B3 45 43 6E 
+// parsed: offset 12, len 20: signature           : febf...8438
+    FE BF FB D0 A8 35 97 52 FC 71 45 C2 D3 90 2B F7 03 4D 84 38 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "B"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 346 (0x00015a) "Ljava/lang/Object;"
+    5A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 366 (0x00016e) "T_iput_byte_3.java"
+    6E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 386 (0x000182) "V"
+    82 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "run"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 394 (0x00018a) "st_i1"
+    8A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "B"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iput_byte_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 401 (0x000191)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 91 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_byte.d.T_iput_byte_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_byte.d.T_iput_byte_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: iput-byte v0, v2, Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;.st_i1:B // field@0000
+//@mod            5D 20 00 00 
+            5D 20 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "B"
+    01 42 00 
+// parsed: offset 299, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 62 79 74 65 2F 64 2F 54 5F 69 70 75 74 5F 62 79 74 65 5F 33 3B 00 
+// parsed: offset 346, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [4] "T_iput_byte_3.java"
+    12 54 5F 69 70 75 74 5F 62 79 74 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 386, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 389, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 394, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_byte/d/T_iput_byte_3;"
+    // parsed: offset 401, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 402, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 403, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 404, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 405, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 406, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 408, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 411, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 413, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 414, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 415, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 417, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 401 (0x000191)
+        00 20 00 00 01 00 00 00 91 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d
new file mode 100644
index 0000000..b29c0e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_30.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_30
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_byte/d/T_iput_byte_30
+    const v1, 0
+    iput-byte v1, v0, dot.junit.opcodes.iput_byte.d.T_iput_byte_30.st_i1 B
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d
new file mode 100644
index 0000000..18a254f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_4.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_4
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-byte v3, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_4.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
new file mode 100644
index 0000000..d349e8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_6.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_6
+.super java/lang/Object
+
+.field public  st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 256
+       iput-byte v0, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_6.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d
new file mode 100644
index 0000000..4ac5aa9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_7.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_7
+.super java/lang/Object
+
+.field public static st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_7.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java
new file mode 100644
index 0000000..3ff9a3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d
new file mode 100644
index 0000000..34b537c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_8.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_byte/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_byte/TestStubs/<init>()V
+
+       const v1, 0
+       iput-byte v1, v0, dot.junit.opcodes.iput_byte.TestStubs.TestStubField B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java
new file mode 100644
index 0000000..8a29bb2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d
new file mode 100644
index 0000000..338b321
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_byte_9.java
+.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_9
+.super java/lang/Object
+
+.field public st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-byte v1, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_9noclass.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java
new file mode 100644
index 0000000..37f7a6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_byte.d;
+
+public class T_iput_byte_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/TestStubs.java
new file mode 100644
index 0000000..a0d947f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char;
+
+public class TestStubs {
+    // used by testVFE9
+    protected char TestStubField = 77;
+    
+    // used by testE5
+    public final char TestStubFieldFinal = 77;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java
new file mode 100644
index 0000000..f3a4f9e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_char.d.T_iput_char_1;
+import dot.junit.opcodes.iput_char.d.T_iput_char_10;
+import dot.junit.opcodes.iput_char.d.T_iput_char_11;
+import dot.junit.opcodes.iput_char.d.T_iput_char_12;
+import dot.junit.opcodes.iput_char.d.T_iput_char_13;
+import dot.junit.opcodes.iput_char.d.T_iput_char_14;
+import dot.junit.opcodes.iput_char.d.T_iput_char_15;
+import dot.junit.opcodes.iput_char.d.T_iput_char_17;
+import dot.junit.opcodes.iput_char.d.T_iput_char_7;
+import dot.junit.opcodes.iput_char.d.T_iput_char_8;
+import dot.junit.opcodes.iput_char.d.T_iput_char_9;
+
+public class Test_iput_char extends DxTestCase {
+    /**
+     * @title put char into field
+     */
+    public void testN1() {
+        T_iput_char_1 t = new T_iput_char_1();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_iput_char_12 t = new T_iput_char_12();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_1
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_14
+        T_iput_char_14 t = new T_iput_char_14();
+        assertEquals(0, t.getProtectedField());
+        t.run();
+        assertEquals(77, t.getProtectedField());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_char_13 t = new T_iput_char_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put char into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_char_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title put value '66000' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_char_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_char.TestStubs
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_8
+        try {
+            new T_iput_char_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_char_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_char_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_1
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_15
+        try {
+            new T_iput_char_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput-char shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-char shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-char shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-char shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-char shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-char shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.iput_char.TestStubs
+        //@uses dot.junit.opcodes.iput_char.d.T_iput_char_11
+    	try {
+            new T_iput_char_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d
new file mode 100644
index 0000000..1872727
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_1.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_1
+.super java/lang/Object
+
+.field public  st_i1 C
+.field protected  st_p1 C
+.field private  st_pvt1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()C
+.limit regs 2
+
+       iget-char v0, v1, dot.junit.opcodes.iput_char.d.T_iput_char_1.st_pvt1 C
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_1.st_i1 C
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java
new file mode 100644
index 0000000..a2a83cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_1 {
+    public  char st_i1;
+    protected  char st_p1;
+    private  char st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public  char getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d
new file mode 100644
index 0000000..466cad9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_10.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_10
+.super java/lang/Object
+
+.field public st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_10.st_i1N C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java
new file mode 100644
index 0000000..2e2c554
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d
new file mode 100644
index 0000000..cd32504
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_11.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_char/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_char/TestStubs/<init>()V
+
+       const v1, 1
+       iput-char v1, v0, dot.junit.opcodes.iput_char.TestStubs.TestStubFieldFinal C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java
new file mode 100644
index 0000000..629d319
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d
new file mode 100644
index 0000000..9aeb2cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_12.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_12
+.super java/lang/Object
+
+.field public  final st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_12.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java
new file mode 100644
index 0000000..b20146a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_12 {
+    public  char st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d
new file mode 100644
index 0000000..9cbce64
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_13.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_13
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       const v1, 77
+       iput-char v1, v0, dot.junit.opcodes.iput_char.d.T_iput_char_13.st_i1 C
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java
new file mode 100644
index 0000000..5f15efc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_13 {
+    
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d
new file mode 100644
index 0000000..71dca61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_14.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_14
+.super dot/junit/opcodes/iput_char/d/T_iput_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_char/d/T_iput_char_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()C
+.limit regs 2
+
+       iget-char v0, v1, dot.junit.opcodes.iput_char.d.T_iput_char_1.st_p1 C
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_1.st_p1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java
new file mode 100644
index 0000000..a55800a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_14 extends T_iput_char_1{
+    
+    public void run() {
+        st_p1 = 77;
+    }
+    
+    public  char getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d
new file mode 100644
index 0000000..4cccb49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_15.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_15
+.super dot/junit/opcodes/iput_char/d/T_iput_char_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_char/d/T_iput_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_1.st_pvt1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java
new file mode 100644
index 0000000..9419df4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d
new file mode 100644
index 0000000..61e503d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_17.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_17.st_i1 C
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java
new file mode 100644
index 0000000..41d3dfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d
new file mode 100644
index 0000000..a9d9ac9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_18.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d
new file mode 100644
index 0000000..cc8cd62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_2.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_2
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-char v0, v2, dot.junit.opcodes.iput_char.d.T_iput_char_4.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d
new file mode 100644
index 0000000..5aa31b2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_20.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-char v3, v3, dot.junit.opcodes.iput_char.d.T_iput_char_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d
new file mode 100644
index 0000000..b9f7cc6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_21.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_21
+.super java/lang/Object
+
+.field public  st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       iput-char v0, v3, dot.junit.opcodes.iput_char.d.T_iput_char_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d
new file mode 100644
index 0000000..ca94dbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_22.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_22
+.super java/lang/Object
+
+.field public  st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-char v0, v3, dot.junit.opcodes.iput_char.d.T_iput_char_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d
new file mode 100644
index 0000000..3494a90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_23.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_23
+.super java/lang/Object
+
+.field public  st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-char v0, v3, dot.junit.opcodes.iput_char.d.T_iput_char_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d
new file mode 100644
index 0000000..d148a4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_24.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_24
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-char v0, v3, dot.junit.opcodes.iput_char.d.T_iput_char_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d
new file mode 100644
index 0000000..05233a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_3.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_3
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       iput-char v0, v2, dot.junit.opcodes.iput_char.d.T_iput_char_3.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh
new file mode 100644
index 0000000..95d1306
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_char/d/T_iput_char_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_char/d/T_iput_char_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : bfb944c4
+    C4 44 B9 BF 
+// parsed: offset 12, len 20: signature           : 661f...6c76
+    66 1F 6A C5 E6 6E 82 B7 E8 AC B8 D2 AC 01 D4 58 34 56 6C 76 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "C"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/iput_char/d/T_iput_char_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 346 (0x00015a) "Ljava/lang/Object;"
+    5A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 366 (0x00016e) "T_iput_char_3.java"
+    6E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 386 (0x000182) "V"
+    82 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "run"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 394 (0x00018a) "st_i1"
+    8A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "C"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iput_char/d/T_iput_char_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iput_char/d/T_iput_char_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iput_char_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 401 (0x000191)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 91 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_char.d.T_iput_char_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_char.d.T_iput_char_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: iput-char v0, v2, Ldot/junit/opcodes/iput_char/d/T_iput_char_3;.st_i1:C // field@0000
+//@mod            5E 20 00 00 
+            5E 20 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "C"
+    01 43 00 
+// parsed: offset 299, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iput_char/d/T_iput_char_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 63 68 61 72 2F 64 2F 54 5F 69 70 75 74 5F 63 68 61 72 5F 33 3B 00 
+// parsed: offset 346, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [4] "T_iput_char_3.java"
+    12 54 5F 69 70 75 74 5F 63 68 61 72 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 386, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 389, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 394, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_char/d/T_iput_char_3;"
+    // parsed: offset 401, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 402, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 403, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 404, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 405, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 406, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 408, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 411, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 413, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 414, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 415, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 417, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 401 (0x000191)
+        00 20 00 00 01 00 00 00 91 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d
new file mode 100644
index 0000000..8182241
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_30.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_30
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_char/d/T_iput_char_30
+    const v1, 0
+    iput-char v1, v0, dot.junit.opcodes.iput_char.d.T_iput_char_30.st_i1 C
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d
new file mode 100644
index 0000000..6f78812
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_4.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_4
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-char v3, v2, dot.junit.opcodes.iput_char.d.T_iput_char_4.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
new file mode 100644
index 0000000..5614d67
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_6.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_6
+.super java/lang/Object
+
+.field public  st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 66000
+       iput-char v0, v2, dot.junit.opcodes.iput_char.d.T_iput_char_6.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d
new file mode 100644
index 0000000..13f4e50
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_7.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_7
+.super java/lang/Object
+
+.field public static st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_7.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java
new file mode 100644
index 0000000..4e148d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d
new file mode 100644
index 0000000..95616a6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_8.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_char/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_char/TestStubs/<init>()V
+
+       const v1, 0
+       iput-char v1, v0, dot.junit.opcodes.iput_char.TestStubs.TestStubField C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java
new file mode 100644
index 0000000..186ce0b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d
new file mode 100644
index 0000000..d2efaae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_char_9.java
+.class public dot.junit.opcodes.iput_char.d.T_iput_char_9
+.super java/lang/Object
+
+.field public st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-char v1, v2, dot.junit.opcodes.iput_char.d.T_iput_char_9noclass.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java
new file mode 100644
index 0000000..3cb3667
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_char.d;
+
+public class T_iput_char_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/TestStubs.java
new file mode 100644
index 0000000..d8354b2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object;
+
+public class TestStubs {
+    // used by testVFE9
+    protected Object TestStubField = null;
+    
+    // used by testE5
+    public final Object TestStubFieldFinal = null;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/Test_iput_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/Test_iput_object.java
new file mode 100644
index 0000000..e2f8fa4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/Test_iput_object.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_object.d.T_iput_object_1;
+import dot.junit.opcodes.iput_object.d.T_iput_object_10;
+import dot.junit.opcodes.iput_object.d.T_iput_object_11;
+import dot.junit.opcodes.iput_object.d.T_iput_object_12;
+import dot.junit.opcodes.iput_object.d.T_iput_object_13;
+import dot.junit.opcodes.iput_object.d.T_iput_object_14;
+import dot.junit.opcodes.iput_object.d.T_iput_object_15;
+import dot.junit.opcodes.iput_object.d.T_iput_object_17;
+import dot.junit.opcodes.iput_object.d.T_iput_object_7;
+import dot.junit.opcodes.iput_object.d.T_iput_object_8;
+import dot.junit.opcodes.iput_object.d.T_iput_object_9;
+
+public class Test_iput_object extends DxTestCase {
+    /**
+     * @title put reference into field
+     */
+    public void testN1() {
+        T_iput_object_1 t = new T_iput_object_1();
+        assertEquals(null, t.st_i1);
+        t.run();
+        assertEquals(t, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_iput_object_12 t = new T_iput_object_12();
+        assertEquals(null, t.st_i1);
+        t.run();
+        assertEquals(t, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_1
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_14
+        T_iput_object_14 t = new T_iput_object_14();
+        assertEquals(null, t.getProtectedField());
+        t.run();
+        assertEquals(t, t.getProtectedField());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_object_13 t = new T_iput_object_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put object into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_object_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_object_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_object.TestStubs
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_8
+        try {
+            new T_iput_object_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_object_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_object_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_1
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_15
+        try {
+            new T_iput_object_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput-object shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title assignment incompatible references
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-object shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-object shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-object shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-object shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-object shall not work for short fields
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_object.d.T_iput_object_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.iput_object.TestStubs
+        //@uses dot.junit.opcodes.iput_object.d.T_iput_object_11
+    	try {
+            new T_iput_object_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d
new file mode 100644
index 0000000..6a9215e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_1.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_1
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+.field protected  st_p1 Ljava/lang/Object;
+.field private  st_pvt1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()Ljava/lang/Object;
+.limit regs 2
+
+       iget-object v0, v1, dot.junit.opcodes.iput_object.d.T_iput_object_1.st_pvt1 Ljava/lang/Object;
+       return-object v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_1.st_i1 Ljava/lang/Object;
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java
new file mode 100644
index 0000000..fdedfda
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_1 {
+    public  Object st_i1;
+    protected  Object st_p1;
+    private  Object st_pvt1;
+    
+    public void run() {
+        st_i1 = this;
+    }
+    
+    public  Object getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d
new file mode 100644
index 0000000..92f9cff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_10.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_10
+.super java/lang/Object
+
+.field public st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_10.st_i1N Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java
new file mode 100644
index 0000000..01e9cb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d
new file mode 100644
index 0000000..f75accc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_11.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_object/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_object/TestStubs/<init>()V
+
+       iput-object v2, v0, dot.junit.opcodes.iput_object.TestStubs.TestStubFieldFinal Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java
new file mode 100644
index 0000000..03c14d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d
new file mode 100644
index 0000000..69f1309
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_12.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_12
+.super java/lang/Object
+
+.field public  final st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_12.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java
new file mode 100644
index 0000000..4a6da45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_12 {
+    public  Object st_i1;
+    
+    public void run() {
+        st_i1 = this;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d
new file mode 100644
index 0000000..f282745
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_13.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_13
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       iput-object v2, v0, dot.junit.opcodes.iput_object.d.T_iput_object_13.st_i1 Ljava/lang/Object;
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java
new file mode 100644
index 0000000..334f14e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+
+public class T_iput_object_13 {
+    
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d
new file mode 100644
index 0000000..4e420fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_14.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_14
+.super dot/junit/opcodes/iput_object/d/T_iput_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_object/d/T_iput_object_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()Ljava/lang/Object;
+.limit regs 2
+
+       iget-object v0, v1, dot.junit.opcodes.iput_object.d.T_iput_object_1.st_p1 Ljava/lang/Object;
+       return-object v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_1.st_p1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java
new file mode 100644
index 0000000..2bc9c2a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_14 extends T_iput_object_1{
+    
+    public void run() {
+        st_p1 = this;
+    }
+    
+    public Object getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d
new file mode 100644
index 0000000..35aeab9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_15.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_15
+.super dot/junit/opcodes/iput_object/d/T_iput_object_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_object/d/T_iput_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_1.st_pvt1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java
new file mode 100644
index 0000000..84667f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d
new file mode 100644
index 0000000..71eb363
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_17.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_17.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java
new file mode 100644
index 0000000..6db4b58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d
new file mode 100644
index 0000000..56d8da8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_18.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d
new file mode 100644
index 0000000..805388f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_2.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_2
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1234    
+       iput-object v0, v2, dot.junit.opcodes.iput_object.d.T_iput_object_2.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d
new file mode 100644
index 0000000..a9b90be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_20.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/String;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-object v3, v3, dot.junit.opcodes.iput_object.d.T_iput_object_20.st_o Ljava/lang/String;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d
new file mode 100644
index 0000000..19aa1cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_21.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_21
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-object v3, v3, dot.junit.opcodes.iput_object.d.T_iput_object_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d
new file mode 100644
index 0000000..8d7272e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_22.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_22
+.super java/lang/Object
+
+.field public  st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-object v3, v3, dot.junit.opcodes.iput_object.d.T_iput_object_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d
new file mode 100644
index 0000000..296a14b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_23.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_23
+.super java/lang/Object
+
+.field public  st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-object v3, v3, dot.junit.opcodes.iput_object.d.T_iput_object_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d
new file mode 100644
index 0000000..51bbb2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_24.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_24
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-object v3, v3, dot.junit.opcodes.iput_object.d.T_iput_object_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d
new file mode 100644
index 0000000..fa05a78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_3.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_3
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+        iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_3.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh
new file mode 100644
index 0000000..8a922e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh
@@ -0,0 +1,253 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_object/d/T_iput_object_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_object/d/T_iput_object_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : e2b84420
+    20 44 B8 E2 
+// parsed: offset 12, len 20: signature           : 498f...47af
+    49 8F 16 1B 5F D7 3D 35 18 CB F9 59 65 B7 A8 60 6A 19 47 AF 
+// parsed: offset 32, len 4: file_size           : 544
+    20 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 408 (0x000198)
+    98 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 7
+    07 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 140 (0x00008c)
+    8C 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 164 (0x0000a4)
+    A4 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 196 (0x0000c4)
+    C4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 228 (0x0000e4)
+    E4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 276 (0x000114) "<init>"
+    14 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 284 (0x00011c) "Ldot/junit/opcodes/iput_object/d/T_iput_object_3;"
+    1C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 335 (0x00014f) "Ljava/lang/Object;"
+    4F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 355 (0x000163) "T_iput_object_3.java"
+    63 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 377 (0x000179) "V"
+    79 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 380 (0x00017c) "run"
+    7C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 385 (0x000181) "st_i1"
+    81 01 00 00 
+
+// type_ids:
+// parsed: offset 140, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/iput_object/d/T_iput_object_3;"
+    01 00 00 00 
+// parsed: offset 144, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 152, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 164, len 8: [0] class_idx: 0 (0x000000)  type_idx: 1 (0x000001) name_idx: 6 (0x000006) "st_i1"
+    00 00 01 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 180, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 188, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 196, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iput_object/d/T_iput_object_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_iput_object_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 392 (0x000188)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 88 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_object.d.T_iput_object_3.<init>"
+    // parsed: offset 228, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 230, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 232, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 234, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 236, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 240, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 244, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 250, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_object.d.T_iput_object_3.run"
+    // parsed: offset 252, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 254, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 256, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 258, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 260, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 264, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 268, len 4: |0000: iput-object v2, v2, Ldot/junit/opcodes/iput_object/d/T_iput_object_3;.st_i1:Ljava/lang/Object; // field@0000
+//@mod            5B 22 00 00 
+            5B 22 00 01 
+        // parsed: offset 272, len 2: |0002: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 274, len 2: PADDING
+    00 00 
+// parsed: offset 276, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 284, len 51: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/iput_object/d/T_iput_object_3;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 6F 62 6A 65 63 74 2F 64 2F 54 5F 69 70 75 74 5F 6F 62 6A 65 63 74 5F 33 3B 00 
+// parsed: offset 335, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 355, len 22: TYPE_STRING_DATA_ITEM [3] "T_iput_object_3.java"
+    14 54 5F 69 70 75 74 5F 6F 62 6A 65 63 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 377, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 380, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// parsed: offset 385, len 7: TYPE_STRING_DATA_ITEM [6] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_object/d/T_iput_object_3;"
+    // parsed: offset 392, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 393, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 394, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 395, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 396, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 397, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 398, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 399, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 402, len 2: code_off: 228 (0x0000e4)
+                E4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 404, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 405, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 406, len 2: code_off: 252 (0x0000fc)
+                FC 01 
+// map_list:
+    // parsed: offset 408, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 412, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 424, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 7
+    //      offset: 112 (0x000070)
+        01 00 00 00 07 00 00 00 70 00 00 00 
+    // parsed: offset 436, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 140 (0x00008c)
+        02 00 00 00 03 00 00 00 8C 00 00 00 
+    // parsed: offset 448, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 152 (0x000098)
+        03 00 00 00 01 00 00 00 98 00 00 00 
+    // parsed: offset 460, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 164 (0x0000a4)
+        04 00 00 00 01 00 00 00 A4 00 00 00 
+    // parsed: offset 472, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 172 (0x0000ac)
+        05 00 00 00 03 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 196 (0x0000c4)
+        06 00 00 00 01 00 00 00 C4 00 00 00 
+    // parsed: offset 496, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 228 (0x0000e4)
+        01 20 00 00 02 00 00 00 E4 00 00 00 
+    // parsed: offset 508, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 7
+    //      offset: 276 (0x000114)
+        02 20 00 00 07 00 00 00 14 01 00 00 
+    // parsed: offset 520, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 392 (0x000188)
+        00 20 00 00 01 00 00 00 88 01 00 00 
+    // parsed: offset 532, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 10 00 00 01 00 00 00 98 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d
new file mode 100644
index 0000000..ace5b2c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_30.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_30
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_object/d/T_iput_object_30
+    const v1, 0
+    iput-object v1, v0, dot.junit.opcodes.iput_object.d.T_iput_object_30.st_i1 Ljava/lang/Object;
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d
new file mode 100644
index 0000000..8906abe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_4.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_4
+.super java/lang/Object
+
+.field public  st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v3, v2, dot.junit.opcodes.iput_object.d.T_iput_object_4.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d
new file mode 100644
index 0000000..5e9f811
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_6.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_6
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v3, v2, dot.junit.opcodes.iput_object.d.T_iput_object_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d
new file mode 100644
index 0000000..25768ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_7.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_7
+.super java/lang/Object
+
+.field public static st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_7.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java
new file mode 100644
index 0000000..60bba2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d
new file mode 100644
index 0000000..971dec4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_8.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_object/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_object/TestStubs/<init>()V
+
+       iput-object v2, v0, dot.junit.opcodes.iput_object.TestStubs.TestStubField Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java
new file mode 100644
index 0000000..f104e78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d
new file mode 100644
index 0000000..3fd712b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_object_9.java
+.class public dot.junit.opcodes.iput_object.d.T_iput_object_9
+.super java/lang/Object
+
+.field public st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-object v2, v2, dot.junit.opcodes.iput_object.d.T_iput_object_9noclass.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java
new file mode 100644
index 0000000..7b53911
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_object.d;
+
+public class T_iput_object_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/TestStubs.java
new file mode 100644
index 0000000..8cee31e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short;
+
+public class TestStubs {
+    // used by testVFE9
+    protected short TestStubField = 77;
+    
+    // used by testE5
+    public final short TestStubFieldFinal = 77;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java
new file mode 100644
index 0000000..0ea32e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java
@@ -0,0 +1,332 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_short.d.T_iput_short_1;
+import dot.junit.opcodes.iput_short.d.T_iput_short_10;
+import dot.junit.opcodes.iput_short.d.T_iput_short_11;
+import dot.junit.opcodes.iput_short.d.T_iput_short_12;
+import dot.junit.opcodes.iput_short.d.T_iput_short_13;
+import dot.junit.opcodes.iput_short.d.T_iput_short_14;
+import dot.junit.opcodes.iput_short.d.T_iput_short_15;
+import dot.junit.opcodes.iput_short.d.T_iput_short_17;
+import dot.junit.opcodes.iput_short.d.T_iput_short_7;
+import dot.junit.opcodes.iput_short.d.T_iput_short_8;
+import dot.junit.opcodes.iput_short.d.T_iput_short_9;
+
+public class Test_iput_short extends DxTestCase {
+    /**
+     * @title put short into field
+     */
+    public void testN1() {
+        T_iput_short_1 t = new T_iput_short_1();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_iput_short_12 t = new T_iput_short_12();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_1
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_14
+        T_iput_short_14 t = new T_iput_short_14();
+        assertEquals(0, t.getProtectedField());
+        t.run();
+        assertEquals(77, t.getProtectedField());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_short_13 t = new T_iput_short_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put short into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_short_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title put value '66000' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_short_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_short.TestStubs
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_8
+        try {
+            new T_iput_short_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_short_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_short_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_1
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_15
+        try {
+            new T_iput_short_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput-short shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-short shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-short shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-short shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-short shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-short shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.iput_short.TestStubs
+        //@uses dot.junit.opcodes.iput_short.d.T_iput_short_11
+    	try {
+            new T_iput_short_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d
new file mode 100644
index 0000000..8aca472
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_1.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_1
+.super java/lang/Object
+
+.field public  st_i1 S
+.field protected  st_p1 S
+.field private  st_pvt1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public getPvtField()S
+.limit regs 2
+
+       iget-short v0, v1, dot.junit.opcodes.iput_short.d.T_iput_short_1.st_pvt1 S
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_1.st_i1 S
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java
new file mode 100644
index 0000000..a804c96
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_1 {
+    public  short st_i1;
+    protected  short st_p1;
+    private  short st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public  short getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d
new file mode 100644
index 0000000..7feaba8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_10.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_10
+.super java/lang/Object
+
+.field public st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_10.st_i1N S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java
new file mode 100644
index 0000000..eb01ab1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d
new file mode 100644
index 0000000..23539d3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_11.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_short/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_short/TestStubs/<init>()V
+
+       const v1, 1
+       iput-short v1, v0, dot.junit.opcodes.iput_short.TestStubs.TestStubFieldFinal S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java
new file mode 100644
index 0000000..dc23c74
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d
new file mode 100644
index 0000000..b0f2f15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_12.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_12
+.super java/lang/Object
+
+.field public  final st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_12.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java
new file mode 100644
index 0000000..eaacd89
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_12 {
+    public  short st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d
new file mode 100644
index 0000000..4472907
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_13.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_13
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 3
+
+       const v0, 0
+       const v1, 77
+       iput-short v1, v0, dot.junit.opcodes.iput_short.d.T_iput_short_13.st_i1 S
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java
new file mode 100644
index 0000000..2ba3c63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+
+public class T_iput_short_13 {
+    
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d
new file mode 100644
index 0000000..f7b07c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_14.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_14
+.super dot/junit/opcodes/iput_short/d/T_iput_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_short/d/T_iput_short_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()S
+.limit regs 2
+
+       iget-short v0, v1, dot.junit.opcodes.iput_short.d.T_iput_short_1.st_p1 S
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_1.st_p1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java
new file mode 100644
index 0000000..8a33e07
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_14 extends T_iput_short_1{
+    
+    public void run() {
+        st_p1 = 77;
+    }
+    
+    public  short getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d
new file mode 100644
index 0000000..5732b91
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_15.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_15
+.super dot/junit/opcodes/iput_short/d/T_iput_short_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_short/d/T_iput_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_1.st_pvt1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java
new file mode 100644
index 0000000..17398b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d
new file mode 100644
index 0000000..bd8966a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_17.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_17
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_17.st_i1 S
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java
new file mode 100644
index 0000000..b89d34b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d
new file mode 100644
index 0000000..5d543c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_18.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_18
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d
new file mode 100644
index 0000000..ae98945
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_2.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_2
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-short v0, v2, dot.junit.opcodes.iput_short.d.T_iput_short_4.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d
new file mode 100644
index 0000000..b7524dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_20.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       iput-short v3, v3, dot.junit.opcodes.iput_short.d.T_iput_short_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d
new file mode 100644
index 0000000..7b80f03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_21.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_21
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       iput-short v0, v3, dot.junit.opcodes.iput_short.d.T_iput_short_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d
new file mode 100644
index 0000000..4f969d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_22.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_22
+.super java/lang/Object
+
+.field public  st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-short v0, v3, dot.junit.opcodes.iput_short.d.T_iput_short_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d
new file mode 100644
index 0000000..6f2cdc1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_23.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_23
+.super java/lang/Object
+
+.field public st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-short v0, v3, dot.junit.opcodes.iput_short.d.T_iput_short_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d
new file mode 100644
index 0000000..326cd78
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_24.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_24
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       iput-short v0, v3, dot.junit.opcodes.iput_short.d.T_iput_short_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d
new file mode 100644
index 0000000..0a091e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_3.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_3
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       iput-short v0, v2, dot.junit.opcodes.iput_short.d.T_iput_short_3.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh
new file mode 100644
index 0000000..f055d5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh
@@ -0,0 +1,259 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_short/d/T_iput_short_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/iput_short/d/T_iput_short_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 69af47b5
+    B5 47 AF 69 
+// parsed: offset 12, len 20: signature           : 8879...c4a0
+    88 79 16 98 CF A1 69 7E 3C 6B E3 73 9E F7 E8 E4 22 93 C4 A0 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "Ldot/junit/opcodes/iput_short/d/T_iput_short_3;"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "Ljava/lang/Object;"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 365 (0x00016d) "S"
+    6D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 368 (0x000170) "T_iput_short_3.java"
+    70 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 389 (0x000185) "V"
+    85 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 392 (0x000188) "run"
+    88 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 397 (0x00018d) "st_i1"
+    8D 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/iput_short/d/T_iput_short_3;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "S"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  type_idx: 2 (0x000002) name_idx: 7 (0x000007) "st_i1"
+    00 00 02 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    00 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/iput_short/d/T_iput_short_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iput_short_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 404 (0x000194)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 94 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_short.d.T_iput_short_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_short.d.T_iput_short_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: iput-short v0, v2, Ldot/junit/opcodes/iput_short/d/T_iput_short_3;.st_i1:S // field@0000
+//@mod            5F 20 00 00 
+            5F 20 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 49: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/iput_short/d/T_iput_short_3;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 73 68 6F 72 74 2F 64 2F 54 5F 69 70 75 74 5F 73 68 6F 72 74 5F 33 3B 00 
+// parsed: offset 345, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 365, len 3: TYPE_STRING_DATA_ITEM [3] "S"
+    01 53 00 
+// parsed: offset 368, len 21: TYPE_STRING_DATA_ITEM [4] "T_iput_short_3.java"
+    13 54 5F 69 70 75 74 5F 73 68 6F 72 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 389, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 392, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 397, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_short/d/T_iput_short_3;"
+    // parsed: offset 404, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 405, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 406, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 407, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 408, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 409, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 410, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 411, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 414, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 417, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 418, len 2: code_off: 260 (0x000104)
+                84 02 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 404 (0x000194)
+        00 20 00 00 01 00 00 00 94 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d
new file mode 100644
index 0000000..51d2ea8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_30.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_30
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_short/d/T_iput_short_30
+    const v1, 0
+    iput-short v1, v0, dot.junit.opcodes.iput_short.d.T_iput_short_30.st_i1 S
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d
new file mode 100644
index 0000000..f201a30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_4.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_4
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-short v3, v2, dot.junit.opcodes.iput_short.d.T_iput_short_4.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
new file mode 100644
index 0000000..ba79d41
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_6.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_6
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 66000
+       iput-short v0, v2, dot.junit.opcodes.iput_short.d.T_iput_short_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d
new file mode 100644
index 0000000..b395108
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_7.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_7
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_7.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java
new file mode 100644
index 0000000..6969f12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d
new file mode 100644
index 0000000..05b5100
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_8.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       new-instance v0, Ldot/junit/opcodes/iput_short/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_short/TestStubs/<init>()V
+
+       const v1, 0
+       iput-short v1, v0, dot.junit.opcodes.iput_short.TestStubs.TestStubField S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java
new file mode 100644
index 0000000..689c54b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d
new file mode 100644
index 0000000..1a1555e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_short_9.java
+.class public dot.junit.opcodes.iput_short.d.T_iput_short_9
+.super java/lang/Object
+
+.field public st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       iput-short v1, v2, dot.junit.opcodes.iput_short.d.T_iput_short_9noclass.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java
new file mode 100644
index 0000000..7f81b96
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_short.d;
+
+public class T_iput_short_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/TestStubs.java
new file mode 100644
index 0000000..617b87f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide;
+
+public class TestStubs {
+    // used by testVFE9
+    protected long TestStubField = 0;
+    
+    // used by testE5
+    public final long TestStubFieldFinal = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java
new file mode 100644
index 0000000..a61bb70
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_1;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_10;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_11;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_12;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_13;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_14;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_15;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_17;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_5;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_7;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_8;
+import dot.junit.opcodes.iput_wide.d.T_iput_wide_9;
+
+public class Test_iput_wide extends DxTestCase {
+    /**
+     * @title put long into field
+     */
+    public void testN1() {
+        T_iput_wide_1 t = new T_iput_wide_1();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(778899112233l, t.st_i1);
+    }
+
+    /**
+     * @title put double into field
+     */
+    public void testN2() {
+        T_iput_wide_5 t = new T_iput_wide_5();
+        assertEquals(0.0d, t.st_i1);
+        t.run();
+        assertEquals(0.5d, t.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN3() {
+        T_iput_wide_12 t = new T_iput_wide_12();
+        assertEquals(0, t.st_i1);
+        t.run();
+        assertEquals(77, t.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_1
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_14
+        T_iput_wide_14 t = new T_iput_wide_14();
+        assertEquals(0, t.getProtectedField());
+        t.run();
+        assertEquals(77, t.getProtectedField());
+    }
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE2() {
+        T_iput_wide_13 t = new T_iput_wide_13();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A11
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B14
+     * @title put int into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_iput_wide_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     *
+     * @constraint B14
+     * @title type of field doesn't match opcode - attempt to modify float
+     * field with double-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A11
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_iput_wide_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint B12
+     * @title Attempt to modify inaccessible protected field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.iput_wide.TestStubs
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_8
+        try {
+            new T_iput_wide_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_iput_wide_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_iput_wide_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_1
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_15
+        try {
+            new T_iput_wide_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title iput-wide shall not work for single-width numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title iput-wide shall not work for short fields
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B6
+     * @title instance fields may only be accessed on already initialized instances.
+     */
+    public void testVFE30() {
+        try {
+            Class.forName("dot.junit.opcodes.iput_wide.d.T_iput_wide_30");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testE5() {
+        //@uses dot.junit.opcodes.iput_wide.TestStubs
+        //@uses dot.junit.opcodes.iput_wide.d.T_iput_wide_11
+        try {
+            new T_iput_wide_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d
new file mode 100644
index 0000000..cae692f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_1.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_1
+.super java/lang/Object
+
+.field public  st_i1 J
+.field protected  st_p1 J
+.field private  st_pvt1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public  getPvtField()J
+.limit regs 3
+
+       iget-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_1.st_pvt1 J
+       return-wide v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 778899112233
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_1.st_i1 J
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java
new file mode 100644
index 0000000..be11462
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_1 {
+    public  long st_i1;
+    protected  long st_p1;
+    private  long st_pvt1;
+    
+    public void run() {
+        st_i1 = 778899112233l;
+    }
+    
+    public  long getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d
new file mode 100644
index 0000000..1ba4cac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_10.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_10
+.super java/lang/Object
+
+.field public st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_10.st_i1N J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java
new file mode 100644
index 0000000..9653b55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d
new file mode 100644
index 0000000..d3401d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_11.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       new-instance v0, Ldot/junit/opcodes/iput_wide/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_wide/TestStubs/<init>()V
+       
+       const-wide v1, 1
+       iput-wide v1, v0, dot.junit.opcodes.iput_wide.TestStubs.TestStubFieldFinal J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java
new file mode 100644
index 0000000..327d5bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d
new file mode 100644
index 0000000..a386a54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_12.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_12
+.super java/lang/Object
+
+.field public  final st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 77
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_12.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java
new file mode 100644
index 0000000..d2d6998
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_12 {
+    public  long st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d
new file mode 100644
index 0000000..cdf7fe6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_13.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_13
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v2, 0
+       const-wide v0, 778899112233
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_13.st_i1 J
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java
new file mode 100644
index 0000000..6053aec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+
+public class T_iput_wide_13 {
+    
+    public void run() {
+
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d
new file mode 100644
index 0000000..22bafcf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_14.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_14
+.super dot/junit/opcodes/iput_wide/d/T_iput_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_wide/d/T_iput_wide_1/<init>()V
+       return-void
+.end method
+
+.method public  getProtectedField()J
+.limit regs 2
+
+       iget-wide v0, v1, dot.junit.opcodes.iput_wide.d.T_iput_wide_1.st_p1 J
+       return-wide v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 77
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_1.st_p1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java
new file mode 100644
index 0000000..f0fb8d3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_14 extends T_iput_wide_1{
+    
+    public void run() {
+        st_p1 = 77;
+    }
+    
+    public  long getProtectedField(){
+        return st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d
new file mode 100644
index 0000000..4e8b2ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_15.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_15
+.super dot/junit/opcodes/iput_wide/d/T_iput_wide_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/iput_wide/d/T_iput_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_1.st_pvt1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java
new file mode 100644
index 0000000..9818c22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d
new file mode 100644
index 0000000..058d1dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_17.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_17
+.super java/lang/Object
+
+.field public  st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_17.st_i1 J
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java
new file mode 100644
index 0000000..60c005e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d
new file mode 100644
index 0000000..1818bed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_18.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_18
+.super java/lang/Object
+
+.field public  st_i1 F
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1.0
+       iput-wide v1, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_18.st_i1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d
new file mode 100644
index 0000000..8d6dc36
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_2.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_2
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_4.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d
new file mode 100644
index 0000000..e0efb25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_20.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_20
+.super java/lang/Object
+
+.field public  st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const-wide v0, 0
+
+       iput-wide v0, v3, dot.junit.opcodes.iput_wide.d.T_iput_wide_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d
new file mode 100644
index 0000000..064a9a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_21.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_21
+.super java/lang/Object
+
+.field public  st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 12    
+       iput-wide v0, v3, dot.junit.opcodes.iput_wide.d.T_iput_wide_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d
new file mode 100644
index 0000000..80a827d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_22.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_22
+.super java/lang/Object
+
+.field public  st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       iput-wide v0, v3, dot.junit.opcodes.iput_wide.d.T_iput_wide_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d
new file mode 100644
index 0000000..d37bbd0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_23.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_23
+.super java/lang/Object
+
+.field public  st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       iput-wide v0, v3, dot.junit.opcodes.iput_wide.d.T_iput_wide_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d
new file mode 100644
index 0000000..3f0102f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_24.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_24
+.super java/lang/Object
+
+.field public  st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       iput-wide v0, v3, dot.junit.opcodes.iput_wide.d.T_iput_wide_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d
new file mode 100644
index 0000000..fc4dc02
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_3.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_3
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_3.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh
new file mode 100644
index 0000000..a0ada5a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dex'...
+// Opened 'dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 71754517
+    17 45 75 71 
+// parsed: offset 12, len 20: signature           : e67a...82a9
+    E6 7A EF BD 44 34 8E F6 ED DF 42 B2 5F 27 17 2B 1D B9 82 A9 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "J"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 370 (0x000172) "T_iput_wide_3.java"
+    72 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 398 (0x00018e) "st_i1"
+    8E 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "J"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_iput_wide_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 405 (0x000195)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 95 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.iput_wide.d.T_iput_wide_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.iput_wide.d.T_iput_wide_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 276, len 10: |0000: const-wide v0, #double 0.000000 // #0x0000000000000001 long
+            18 00 01 00 00 00 00 00 00 00 
+        // parsed: offset 286, len 4: |0005: iput-wide v0, v2, Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;.st_i1:J // field@0000
+//@mod            5A 20 00 00 
+            5A 20 00 01 
+        // parsed: offset 290, len 2: |0007: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "J"
+    01 4A 00 
+// parsed: offset 303, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 69 70 75 74 5F 77 69 64 65 2F 64 2F 54 5F 69 70 75 74 5F 77 69 64 65 5F 33 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 20: TYPE_STRING_DATA_ITEM [4] "T_iput_wide_3.java"
+    12 54 5F 69 70 75 74 5F 77 69 64 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 398, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/iput_wide/d/T_iput_wide_3;"
+    // parsed: offset 405, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 406, len 1: instance_fields_size: 1
+        01 
+    // parsed: offset 407, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 408, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+        // field [0]:
+            // parsed: offset 409, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 410, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 411, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 412, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 415, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 417, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 418, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 419, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 421, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 292 (0x000124)
+        02 20 00 00 08 00 00 00 24 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 405 (0x000195)
+        00 20 00 00 01 00 00 00 95 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d
new file mode 100644
index 0000000..9513dc8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_30.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_30
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+    new-instance v0, dot/junit/opcodes/iput_wide/d/T_iput_wide_30
+    const-wide v1, 0
+    iput-wide v1, v0, dot.junit.opcodes.iput_wide.d.T_iput_wide_30.st_i1 J
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d
new file mode 100644
index 0000000..6036cc6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_4.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_4
+.super java/lang/Object
+
+.field public  st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       iput-wide v3, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_4.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d
new file mode 100644
index 0000000..3c1d9ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_5.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_5
+.super java/lang/Object
+
+.field public  st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 0.5
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_5.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java
new file mode 100644
index 0000000..a508e8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_5 {
+    public  double st_i1;
+    
+    public void run() {
+        st_i1 = 0.5d;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d
new file mode 100644
index 0000000..31f4f12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_6.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_6
+.super java/lang/Object
+
+.field public  st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d
new file mode 100644
index 0000000..df5079c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_7.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_7
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 0
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_7.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java
new file mode 100644
index 0000000..e476c01
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d
new file mode 100644
index 0000000..12a0d92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_8.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+       new-instance v0, Ldot/junit/opcodes/iput_wide/TestStubs;
+       invoke-direct {v0}, dot/junit/opcodes/iput_wide/TestStubs/<init>()V
+       
+       const-wide v1, 0
+       iput-wide v1, v0, dot.junit.opcodes.iput_wide.TestStubs.TestStubField J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java
new file mode 100644
index 0000000..dc2e2bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d
new file mode 100644
index 0000000..aecd210
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_iput_wide_9.java
+.class public dot.junit.opcodes.iput_wide.d.T_iput_wide_9
+.super java/lang/Object
+
+.field public st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 0
+       iput-wide v0, v2, dot.junit.opcodes.iput_wide.d.T_iput_wide_9noclass.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java
new file mode 100644
index 0000000..c9d1da2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.iput_wide.d;
+
+public class T_iput_wide_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java
new file mode 100644
index 0000000..fb55b8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.long_to_double.d.T_long_to_double_1;
+import dot.junit.opcodes.long_to_double.d.T_long_to_double_6;
+
+public class Test_long_to_double extends DxTestCase {
+    /**
+     * @title Argument = 50000000000
+     */
+    public void testN1() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(5.0E10d, t.run(50000000000l), 0d);
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(1d, t.run(1l), 0d);
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(-1d, t.run(-1l), 0d);
+    }
+
+    /**
+     * @title Type of argument - double. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of double to double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_long_to_double_6 t = new T_long_to_double_6();
+        try {
+            t.run(12345);
+        } catch (Throwable e) {
+        }
+    }       
+    
+    /**
+     * @title Argument = Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(9.223372036854776E18d, t.run(Long.MAX_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(-9.223372036854776E18, t.run(Long.MIN_VALUE), 0d);
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_long_to_double_1 t = new T_long_to_double_1();
+        assertEquals(0d, t.run(0), 0d);
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - float
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_double.d.T_long_to_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - integer
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_double.d.T_long_to_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_double.d.T_long_to_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_double.d.T_long_to_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d
new file mode 100644
index 0000000..d1e068c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_1.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       long-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java
new file mode 100644
index 0000000..f1ce414
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_double.d;
+
+public class T_long_to_double_1 {
+
+    public double run(long a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d
new file mode 100644
index 0000000..3201a77
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_2.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       const v6, 3.1415
+       long-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d
new file mode 100644
index 0000000..83c423c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_3.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       const v6, 1234
+       long-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d
new file mode 100644
index 0000000..03bc7bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_4.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       long-to-double v0, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d
new file mode 100644
index 0000000..6656834
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_5.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       long-to-double v0, v8
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d
new file mode 100644
index 0000000..8e430fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_double_6.java
+.class public dot.junit.opcodes.long_to_double.d.T_long_to_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)D
+.limit regs 8
+
+       long-to-double v0, v6
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java
new file mode 100644
index 0000000..f676c16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_double.d;
+
+public class T_long_to_double_6 {
+
+    public double run(double a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java
new file mode 100644
index 0000000..1e06437
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.long_to_float.d.T_long_to_float_1;
+import dot.junit.opcodes.long_to_float.d.T_long_to_float_2;
+
+public class Test_long_to_float extends DxTestCase {
+    /**
+     * @title Argument = 123456789012345
+     */
+    public void testN1() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(1.23456788E14f, t.run(123456789012345l), 0f);
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(1f, t.run(1l), 0f);
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(-1f, t.run(-1l), 0f);
+    }
+
+    /**
+     * @title Type of argument - double. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of double to double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_long_to_float_2 t = new T_long_to_float_2();
+        try {
+            t.run(12345);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Argument = Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(9.223372036854776E18, t.run(Long.MAX_VALUE), 0f);
+    }
+
+    /**
+     * @title Argument = Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(-9.223372036854776E18, t.run(Long.MIN_VALUE), 0f);
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_long_to_float_1 t = new T_long_to_float_1();
+        assertEquals(0f, t.run(0l), 0f);
+    }
+
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - integer
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_float.d.T_long_to_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_float.d.T_long_to_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_float.d.T_long_to_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d
new file mode 100644
index 0000000..3f0602b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_float_1.java
+.class public dot.junit.opcodes.long_to_float.d.T_long_to_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 8
+
+       long-to-float v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java
new file mode 100644
index 0000000..67eca97
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_float.d;
+
+public class T_long_to_float_1 {
+
+    public float run(long a) {
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d
new file mode 100644
index 0000000..0f4a557
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_float_2.java
+.class public dot.junit.opcodes.long_to_float.d.T_long_to_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 8
+
+       long-to-float v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java
new file mode 100644
index 0000000..409d2ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_float.d;
+
+public class T_long_to_float_2 {
+
+    public float run(double a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d
new file mode 100644
index 0000000..002e5d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_float_3.java
+.class public dot.junit.opcodes.long_to_float.d.T_long_to_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 8
+
+       const v6, 1234
+       long-to-float v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d
new file mode 100644
index 0000000..acb99d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_float_4.java
+.class public dot.junit.opcodes.long_to_float.d.T_long_to_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 8
+
+       long-to-float v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d
new file mode 100644
index 0000000..5cb993e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_float_5.java
+.class public dot.junit.opcodes.long_to_float.d.T_long_to_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 8
+
+       long-to-float v0, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java
new file mode 100644
index 0000000..2440fa5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.long_to_int.d.T_long_to_int_1;
+import dot.junit.opcodes.long_to_int.d.T_long_to_int_2;
+
+public class Test_long_to_int extends DxTestCase {
+    /**
+     * @title Argument = 0xAAAAFFEEDDCCl
+     */
+    public void testN1() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(0xFFEEDDCC, t.run(0xAAAAFFEEDDCCl));
+    }
+
+    /**
+     * @title Argument = -123456789
+     */
+    public void testN2() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(-123456789, t.run(-123456789l));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN3() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(1, t.run(1l));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN4() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(-1, t.run(-1l));
+    }
+    
+    /**
+     * @title Type of argument - double. Dalvik doens't distinguish 64-bits types internally,
+     * so this conversion of double to int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_long_to_int_2 t = new T_long_to_int_2();
+        try {
+            t.run(12345);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(-1, t.run(Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(0, t.run(Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_long_to_int_1 t = new T_long_to_int_1();
+        assertEquals(0, t.run(0l));
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title  type of argument - float
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_int.d.T_long_to_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_int.d.T_long_to_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_int.d.T_long_to_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  type of argument - int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.long_to_int.d.T_long_to_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d
new file mode 100644
index 0000000..2f73956
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_1.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       long-to-int v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java
new file mode 100644
index 0000000..77f6c5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_int.d;
+
+public class T_long_to_int_1 {
+
+    public int run(long a) {
+        return (int) a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d
new file mode 100644
index 0000000..1732d7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_2.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       long-to-int v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java
new file mode 100644
index 0000000..97b9ac4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.long_to_int.d;
+
+public class T_long_to_int_2 {
+
+    public int run(double a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d
new file mode 100644
index 0000000..1d4665b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_3.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       const v6, 1234.0
+       long-to-int v0, v6
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d
new file mode 100644
index 0000000..50e5889
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_4.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       long-to-int v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d
new file mode 100644
index 0000000..5b65864
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_5.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       long-to-int v0, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d
new file mode 100644
index 0000000..ad412f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_long_to_int_6.java
+.class public dot.junit.opcodes.long_to_int.d.T_long_to_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)V
+.limit regs 8
+       move v0, v7
+       move v1, v7
+       long-to-int v0, v0
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java
new file mode 100644
index 0000000..3608793
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_enter;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1;
+import dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2;
+import dot.junit.opcodes.monitor_enter.d.T_monitor_enter_3;
+
+public class Test_monitor_enter extends DxTestCase {
+
+    /**
+     * @title tests monitor-enter functionality
+     * 
+     * @throws InterruptedException
+     */
+    public void testN1() throws InterruptedException {
+        //@uses dot.junit.opcodes.monitor_enter.TestRunnable
+        final T_monitor_enter_1 t1 = new T_monitor_enter_1();
+        Runnable r1 = new TestRunnable(t1);
+        Runnable r2 = new TestRunnable(t1);
+        Thread tr1 = new Thread(r1);
+        Thread tr2 = new Thread(r2);
+        tr1.start();
+        tr2.start();
+
+        tr1.join();
+        tr2.join();
+        assertEquals(2, t1.counter);
+    }
+
+    /**
+     * @title Tests behavior when monitor owned by current thread.
+     * 
+     * @throws InterruptedException
+     */
+    public void testN2() throws InterruptedException {
+        //@uses dot.junit.opcodes.monitor_enter.TestRunnable2
+        final T_monitor_enter_2 t1 = new T_monitor_enter_2();
+        Runnable r1 = new TestRunnable2(t1, 10);
+        Runnable r2 = new TestRunnable2(t1, 20);
+        Thread tr1 = new Thread(r1);
+        Thread tr2 = new Thread(r2);
+        tr1.start();
+        tr2.start();
+
+        tr1.join();
+        tr2.join();
+        assertTrue(t1.result);
+    }
+
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE1() {
+        T_monitor_enter_3 t = new T_monitor_enter_3();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_enter.d.T_monitor_enter_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_enter.d.T_monitor_enter_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_enter.d.T_monitor_enter_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_enter.d.T_monitor_enter_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_enter.d.T_monitor_enter_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
+
+class TestRunnable implements Runnable {
+    private T_monitor_enter_1 t1;
+    TestRunnable(T_monitor_enter_1 t1) {
+        this.t1 = t1;
+    }
+    
+    public void run() {
+        try {
+            t1.run();
+        } catch (InterruptedException e) {
+            throw new RuntimeException("interrupted!");
+        }
+    }
+}
+
+class TestRunnable2 implements Runnable {
+    private T_monitor_enter_2 t2;
+    private int val;
+    TestRunnable2(T_monitor_enter_2 t2, int val) {
+        this.t2 = t2;
+        this.val = val;
+    }
+    
+    public void run() {
+        try {
+            t2.run(val);
+        } catch (InterruptedException e) {
+            throw new RuntimeException("interrupted!");
+        }
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d
new file mode 100644
index 0000000..eb443b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d
@@ -0,0 +1,63 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_1.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1
+.super java/lang/Object
+
+.field public counter I
+
+.method public <init>()V
+.limit regs 2
+
+       invoke-direct {v1}, java/lang/Object/<init>()V
+
+       const/4 v0, 0
+
+       iput v0, v1, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+       return-void
+.end method
+
+.method public run()V
+.limit regs 8
+       monitor-enter v7
+Label8:
+       iget v1, v7, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+
+       const-wide/16 v3, 500
+       invoke-static {v3, v4}, java/lang/Thread/sleep(J)V
+       
+       iget v2, v7, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+       
+       if-ne v1, v2, Label0
+       
+       add-int/lit8 v1, v1, 1
+       iput v1, v7, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+       monitor-exit v7
+Label24:
+       return-void
+Label0:
+       const/4 v5, -1
+       iput v5, v7, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+       monitor-exit v7
+       return-void
+       
+Label25:
+       move-exception v3
+       monitor-exit v7
+       const/4 v5, -1
+       iput v5, v7, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_1.counter I
+       throw v3
+.catch all from Label8 to Label24 using Label25
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java
new file mode 100644
index 0000000..39113fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_enter.d;
+
+public class T_monitor_enter_1 {
+    public int counter = 0;
+    
+    public void run() throws InterruptedException  {
+        synchronized(this) {
+            int a = counter;
+            Thread.sleep(500);
+            counter = ++a;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d
new file mode 100644
index 0000000..2e7fc6f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d
@@ -0,0 +1,85 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_2.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2
+.super java/lang/Object
+
+.field private flg I
+.field public result Z
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const/4 v2, 0
+       iput v2, v3, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.flg I
+
+       const/4 v2, 1
+       iput-boolean v2, v3, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.result Z
+       return-void
+.end method
+
+.method public run(I)V
+.limit regs 10
+
+       monitor-enter v8
+Label13:
+       monitor-enter v8
+Label14:
+
+       iput v9, v8, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.flg I
+       
+Label16:
+       monitor-exit v8
+Label20:
+
+       const-wide/16 v4, 500
+
+Label22:
+       invoke-static {v4, v5}, java/lang/Thread/sleep(J)V
+Label23:
+
+       iget v1, v8, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.flg I
+
+       if-eq v1, v9, Label35
+
+       const/4 v5, 0
+       iput-boolean v5, v8, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.result Z
+       
+Label35:
+       monitor-exit v8
+Label37:
+       return-void
+       
+       
+Label46:
+       move-exception v4
+
+       const/4 v6, 0
+       iput-boolean v6, v8, dot.junit.opcodes.monitor_enter.d.T_monitor_enter_2.result Z
+
+       monitor-exit v8
+Label53:
+       throw v4
+       
+.catch all from Label13 to Label14 using Label46
+.catch all from Label16 to Label20 using Label46
+.catch all from Label22 to Label23 using Label46
+.catch all from Label35 to Label37 using Label46
+.catch all from Label46 to Label53 using Label46
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java
new file mode 100644
index 0000000..d2f5add
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_enter.d;
+
+public class T_monitor_enter_2 {
+
+     private int flg = 0;
+     public boolean result = true;
+        
+     public void run(int v) throws InterruptedException  {
+         synchronized(this) {
+             synchronized(this) {
+                 flg = v;
+             }
+             Thread.sleep(500);
+             if(flg != v) {
+                 result = false;
+             }
+         }
+     }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
new file mode 100644
index 0000000..7417a8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_3.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const/4 v5, 0
+       monitor-enter v5
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java
new file mode 100644
index 0000000..ebb0f17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_enter.d;
+
+public class T_monitor_enter_3 {
+
+    public void run() {
+        Object o = null;
+        synchronized(o) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d
new file mode 100644
index 0000000..5b3469d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_4.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       monitor-enter v6
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java
new file mode 100644
index 0000000..83c41d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_enter.d;
+
+public class T_monitor_enter_4 {
+
+    public void run() {
+        Object o = null;
+        synchronized(o) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d
new file mode 100644
index 0000000..7078aa0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_5.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const v5, 12345
+       monitor-enter v5
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d
new file mode 100644
index 0000000..754a9e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_6.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const v5, 1.23
+       monitor-enter v5
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d
new file mode 100644
index 0000000..8fb7791
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_7.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const-wide v4, 123456789321
+       monitor-enter v4
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d
new file mode 100644
index 0000000..3d45716
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_enter_8.java
+.class public dot.junit.opcodes.monitor_enter.d.T_monitor_enter_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const-wide v4, 1.79
+       monitor-enter v4
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java
new file mode 100644
index 0000000..d4f5842
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_exit;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.monitor_exit.d.T_monitor_exit_1;
+import dot.junit.opcodes.monitor_exit.d.T_monitor_exit_3;
+
+public class Test_monitor_exit extends DxTestCase {
+
+    /**
+     * @title thread is not monitor owner
+     */
+    public void testE1() throws InterruptedException {
+        //@uses dot.junit.opcodes.monitor_exit.TestRunnable
+        final T_monitor_exit_1 t = new T_monitor_exit_1();
+        final Object o = new Object();
+
+        Runnable r = new TestRunnable(t, o);
+        synchronized (o) {
+            Thread th = new Thread(r);
+            th.start();
+            th.join();
+        }
+        if (t.result == false) {
+            fail("expected IllegalMonitorStateException");
+        }
+    }
+
+
+    /**
+     * @title expected NullPointerException
+     */
+    public void testE3() {
+        T_monitor_exit_3 t = new T_monitor_exit_3();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_exit.d.T_monitor_exit_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title  type of arguments - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_exit.d.T_monitor_exit_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  type of arguments - float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_exit.d.T_monitor_exit_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  type of arguments - long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_exit.d.T_monitor_exit_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  type of arguments - double
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.monitor_exit.d.T_monitor_exit_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
+
+
+class TestRunnable implements Runnable {
+    private T_monitor_exit_1 t;
+    private Object o;
+
+    public TestRunnable(T_monitor_exit_1 t, Object o) {
+        this.t = t;
+        this.o = o;
+    }
+
+    public void run() {
+        try {
+            t.run(o);
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+            t.result = true;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
new file mode 100644
index 0000000..bef8390
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_1.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_1
+.super java/lang/Object
+
+.field public result Z
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const/4 v2, 1
+       iput-boolean v2, v3, dot.junit.opcodes.monitor_exit.d.T_monitor_exit_1.result Z
+
+       return-void
+.end method
+
+.method public run(Ljava/lang/Object;)V
+.limit regs 5
+
+       monitor-exit v3
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java
new file mode 100644
index 0000000..ff61a53
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_exit.d;
+
+public class T_monitor_exit_1 {
+
+    public boolean result = false;
+    
+    public void run(Object o) {
+        synchronized(o) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d
new file mode 100644
index 0000000..9ef4034
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_3.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+
+       const/4 v1, 0
+Label4:
+       monitor-exit v1
+Label5:
+       return-void
+Label6:
+       move-exception v1
+       monitor-exit v3
+       throw v1
+.catch all from Label4 to Label5 using Label6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java
new file mode 100644
index 0000000..162dd58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.monitor_exit.d;
+
+public class T_monitor_exit_3 {
+
+    public void run() {
+        synchronized(this) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d
new file mode 100644
index 0000000..334f385
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_4.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+       monitor-exit v4
+
+       return-void       
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d
new file mode 100644
index 0000000..9def3d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_5.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+       const v3, 12345
+       monitor-exit v3
+       return-void       
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d
new file mode 100644
index 0000000..9635212
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_6.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+       const v3, 1.123
+       monitor-exit v3
+       return-void       
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d
new file mode 100644
index 0000000..c65ae56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_7.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+       const-wide v0, 123456789321
+       monitor-exit v0
+       return-void       
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d
new file mode 100644
index 0000000..91be219
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_monitor_exit_8.java
+.class public dot.junit.opcodes.monitor_exit.d.T_monitor_exit_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       monitor-enter v3
+       const-wide v0, 1.79
+       monitor-exit v0
+       return-void       
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/Test_move.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move/Test_move.java
new file mode 100644
index 0000000..d503890
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/Test_move.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move.d.T_move_1;
+
+public class Test_move extends DxTestCase {
+    /**
+     * @title test move functionality
+     */
+    public void testN1() {
+        assertTrue(T_move_1.run());
+    }
+
+
+    /**
+     * @constraint A23 
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move.d.T_move_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.d
new file mode 100644
index 0000000..1d8e693
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_move_1.java
+.class public dot.junit.opcodes.move.d.T_move_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 16
+       const v0, 1234
+       const v15, 567989
+
+       move v0, v15
+       
+       const v4, 567989
+
+       if-ne v0, v4, Label0
+       if-ne v15, v4, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.java
new file mode 100644
index 0000000..97f538f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move.d;
+
+public class T_move_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_2.d
new file mode 100644
index 0000000..4a5dfc7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_2.java
+.class public dot.junit.opcodes.move.d.T_move_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 9
+
+       move v0, v9
+
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_3.d
new file mode 100644
index 0000000..c9d094b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_3.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_move_3.java
+.class public dot.junit.opcodes.move.d.T_move_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 9
+       const v0, 0
+
+       move v15, v0
+
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_4.d
new file mode 100644
index 0000000..54adf05
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_4.java
+.class public dot.junit.opcodes.move.d.T_move_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+       move v1, v8
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_5.d
new file mode 100644
index 0000000..1ab33b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_5.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_move_5.java
+.class public dot.junit.opcodes.move.d.T_move_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 9
+       const-wide v0, 124
+
+       move v5, v0
+
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_6.d
new file mode 100644
index 0000000..91da915
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_move_6.java
+.class public dot.junit.opcodes.move.d.T_move_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 9
+       const-wide v0, 124
+
+       move v5, v1
+
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_7.d
new file mode 100644
index 0000000..fa615c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move/d/T_move_7.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_move_7.java
+.class public dot.junit.opcodes.move.d.T_move_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 9
+       const-wide v0, 124
+       const v5, 0
+
+       move v1, v5
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/Test_move_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/Test_move_16.java
new file mode 100644
index 0000000..f3e2ab0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/Test_move_16.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_16.d.T_move_16_1;
+import dot.junit.opcodes.move_16.d.T_move_16_2;
+
+public class Test_move_16 extends DxTestCase {
+    /**
+     * @title v4001 -> v4000
+     */
+    public void testN1() {
+        assertTrue(T_move_16_1.run());
+    }
+    
+    /**
+     * @title v1 -> v4001
+     */
+    public void testN2() {
+        assertTrue(T_move_16_2.run());
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_16.d.T_move_16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.d
new file mode 100644
index 0000000..bb5335f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_1.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const v0, 123
+       const v1, 5678
+       
+       move/16 v4000, v0
+       move/16 v4001, v1
+       
+       move/16 v4000, v4001
+       
+       const/4 v4, 5678
+       
+       move/16 v0, v4000
+       move/16 v1, v4001
+
+       if-ne v0, v4, Label0
+       if-ne v1, v4, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.java
new file mode 100644
index 0000000..203468b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_16.d;
+
+public class T_move_16_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.d
new file mode 100644
index 0000000..52454ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_2.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const v1, 5678
+       
+       move/16 v4001, v1
+       move/16 v0, v4001
+       
+       const/4 v4, 5678
+
+       if-ne v0, v4, Label0
+       if-ne v1, v4, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.java
new file mode 100644
index 0000000..4729303
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_16.d;
+
+public class T_move_16_2 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_3.d
new file mode 100644
index 0000000..604cbf3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_3.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       move/16 v0, v5000
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_4.d
new file mode 100644
index 0000000..2c098a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_4.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const v0, 0
+       move/16 v5000, v0
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_5.d
new file mode 100644
index 0000000..ccacc33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_5.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move/16 v0, v4999
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_6.d
new file mode 100644
index 0000000..eb4b9c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_6.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const-wide v123, 123
+       move/16 v255, v123
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_7.d
new file mode 100644
index 0000000..a6aa1d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_7.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+
+       const-wide v123, 123
+       move/16 v255, v124
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_8.d
new file mode 100644
index 0000000..8d98954
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_16/d/T_move_16_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_16_8.java
+.class public dot.junit.opcodes.move_16.d.T_move_16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       const v0, 0
+       move/16 v124, v0
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/Test_move_exception.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/Test_move_exception.java
new file mode 100644
index 0000000..b4fd87c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/Test_move_exception.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_exception;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_exception.d.T_move_exception_1;
+import dot.junit.opcodes.move_exception.d.T_move_exception_2;
+
+public class Test_move_exception extends DxTestCase {
+    
+    /**
+     * @title tests move-exception functionality
+     */
+    public void testN1() {
+        T_move_exception_1 t = new T_move_exception_1();
+        try {
+            t.run();
+            fail("ArithmeticException was not thrown");
+        } catch (ArithmeticException ae) {
+            //expected
+        } catch (Exception ex) {
+            fail("Exception " + ex + " was thrown instead off ArithmeticException");
+        }
+    }
+    
+    /**
+     * @title tests move-exception functionality
+     */
+    public void testN2() {
+        T_move_exception_2 t = new T_move_exception_2();
+        assertTrue(t.run());
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_exception.d.T_move_exception_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B21 
+     * @title  move-exception is not first instruction in an exception handler
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_exception.d.T_move_exception_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }    
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d
new file mode 100644
index 0000000..ed7aa2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_move_exception_1.java
+.class public dot.junit.opcodes.move_exception.d.T_move_exception_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+Label1:
+       const v1, 15
+       const v2, 0
+       div-int v0, v1, v2 
+       
+Label2:
+       goto Label4
+
+Label3:
+       move-exception v3
+       throw v3
+
+Label4:
+       return-void
+
+.catch all from Label1 to Label2 using Label3
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java
new file mode 100644
index 0000000..9edf6ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_exception.d;
+
+public class T_move_exception_1 {
+    
+    public void run() {
+        try{
+            int a = 15/0;
+        } catch(Exception ex) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d
new file mode 100644
index 0000000..8713f3a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_move_exception_2.java
+.class public dot.junit.opcodes.move_exception.d.T_move_exception_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 6
+
+Label1:
+       const v1, 1
+       const v2, 0
+       div-int v0, v1, v2 
+       
+Label2:
+       goto Label4
+
+Label3:
+       move-exception v3
+       const v4, 1
+       return v4
+
+Label4:
+       const v4, 0
+       return v4
+
+.catch java/lang/RuntimeException from Label1 to Label2 using Label3
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java
new file mode 100644
index 0000000..ed66c22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_exception.d;
+
+public class T_move_exception_2 {
+    
+    public boolean run() {
+        try {
+            int a = 15/0;
+        } catch (ArithmeticException ae) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d
new file mode 100644
index 0000000..8141ddb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d
@@ -0,0 +1,31 @@
+.source T_move_exception_3.java
+.class public dot.junit.opcodes.move_exception.d.T_move_exception_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+Label1:
+       const v1, 1
+       const v2, 0
+       div-int v0, v1, v2 
+       
+Label2:
+       goto Label4
+
+Label3:
+       move-exception v6
+
+Label4:
+       return-void
+
+.catch all from Label1 to Label2 using Label3
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d
new file mode 100644
index 0000000..fdad390
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_move_exception_5.java
+.class public dot.junit.opcodes.move_exception.d.T_move_exception_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+Label1:
+       const v1, 15
+       const v2, 0
+       div-int v0, v1, v2 
+       
+Label2:
+       goto Label4
+
+Label3:
+       nop
+       move-exception v3
+       throw v3
+
+Label4:
+       return-void
+
+.catch all from Label1 to Label2 using Label3
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/Test_move_from16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/Test_move_from16.java
new file mode 100644
index 0000000..725cbd8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/Test_move_from16.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_from16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_from16.d.T_move_from16_1;
+
+public class Test_move_from16 extends DxTestCase {
+    /**
+     * @title v4001 -> v255 -> v1
+     */
+    public void testN1() {
+        assertTrue(T_move_from16_1.run());
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_from16.d.T_move_from16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d
new file mode 100644
index 0000000..e445cea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_1.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const v10, 5678
+   
+       move/16 v4001, v10
+       
+       move/from16 v255, v4001
+       move/from16 v1, v255
+       
+       const/4 v4, 5678
+       
+       if-ne v1, v4, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java
new file mode 100644
index 0000000..a32e85c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_from16.d;
+
+public class T_move_from16_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d
new file mode 100644
index 0000000..88b3cae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_3.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       move/from16 v0, v5000
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d
new file mode 100644
index 0000000..e544a14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_4.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5
+       const v1, 0    
+       move/from16 v5, v1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d
new file mode 100644
index 0000000..400a01f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_5.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move/from16 v0, v4999
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d
new file mode 100644
index 0000000..662e314
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_6.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const-wide v4500, 123
+       move/from16 v0, v4500
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d
new file mode 100644
index 0000000..7d2f26c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_7.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+
+       const-wide v1234, 123
+       move/from16 v255, v1235
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d
new file mode 100644
index 0000000..5f8455a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_from16_8.java
+.class public dot.junit.opcodes.move_from16.d.T_move_from16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       const v0, 0
+       move/from16 v124, v0
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/Test_move_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/Test_move_object.java
new file mode 100644
index 0000000..d67be88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/Test_move_object.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_object.d.T_move_object_1;
+
+public class Test_move_object extends DxTestCase {
+    /**
+     * @title tests move-object functionality
+     */
+    public void testN1() {
+        T_move_object_1 t = new T_move_object_1(); 
+        assertEquals(t.run(), t);
+    }
+
+
+    /**
+     * @constraint A23 
+     * @title  number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains integer
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object.d.T_move_object_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.d
new file mode 100644
index 0000000..cc90a5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_1.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 16
+
+       move-object v0, v15
+       
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.java
new file mode 100644
index 0000000..c0b2483
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object.d;
+
+public class T_move_object_1 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_2.d
new file mode 100644
index 0000000..4df3976
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_2.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+
+.method public run()V
+.limit regs 9
+
+       move-object v15, v8
+
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_3.d
new file mode 100644
index 0000000..647a220
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_3.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+
+       move-object v1, v15
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_4.d
new file mode 100644
index 0000000..f5538f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_4.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+       const v0, 1
+       move-object v1, v0
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_5.d
new file mode 100644
index 0000000..d7951a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_5.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+       const-wide v0, 124
+
+       move-object v5, v0
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_6.d
new file mode 100644
index 0000000..7db5136
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_6.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+       const-wide v0, 124
+
+       move-object v5, v1
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_7.d
new file mode 100644
index 0000000..0fe5509
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object/d/T_move_object_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_7.java
+.class public dot.junit.opcodes.move_object.d.T_move_object_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 9
+       const-wide v0, 124
+
+       move-object v1, v8
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java
new file mode 100644
index 0000000..c3780cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_object_16.d.T_move_object_16_1;
+
+public class Test_move_object_16 extends DxTestCase {
+    /**
+     * @title v4999 -> v4000 -> v1
+     */
+    public void testN1() {
+        T_move_object_16_1 t = new T_move_object_16_1(); 
+        assertEquals(t.run(), t);
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains integer
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_16.d.T_move_object_16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d
new file mode 100644
index 0000000..b60a448
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_1.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5000
+       move-object/16 v4000, v4999
+       move-object/16 v1, v4000
+
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java
new file mode 100644
index 0000000..d0b85bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object_16.d;
+
+public class T_move_object_16_1 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d
new file mode 100644
index 0000000..aad9893
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_3.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move-object/16 v0, v5000
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d
new file mode 100644
index 0000000..463646c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_4.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+       move-object/16 v6, v4
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d
new file mode 100644
index 0000000..8cceaff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_5.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       const v0, 1234    
+       move-object/16 v2000, v0
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d
new file mode 100644
index 0000000..6a5035d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_6.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       const-wide v123, 123
+       move-object/16 v255, v123
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d
new file mode 100644
index 0000000..0fce2b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_7.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+
+       const-wide v123, 123
+       move-object/16 v255, v124
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d
new file mode 100644
index 0000000..8f0d925
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_16_8.java
+.class public dot.junit.opcodes.move_object_16.d.T_move_object_16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       move-object/16 v124, v4999
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java
new file mode 100644
index 0000000..2fe17d3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object_from16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_object_from16.d.T_move_object_from16_1;
+
+
+public class Test_move_object_from16 extends DxTestCase {
+    /**
+     * @title v4999 -> v255 -> v1
+     */
+    public void testN1() {
+        T_move_object_from16_1 t = new T_move_object_from16_1(); 
+        assertEquals(t.run(), t);
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains integer
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains wide
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_object_from16.d.T_move_object_from16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d
new file mode 100644
index 0000000..434737e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_1.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5000
+       move-object/from16 v255, v4999
+       move-object/from16 v1, v255
+       
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java
new file mode 100644
index 0000000..75f4bac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_object_from16.d;
+
+public class T_move_object_from16_1 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d
new file mode 100644
index 0000000..c2f4512
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_3.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move/from16 v0, v5000
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d
new file mode 100644
index 0000000..360ae14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_4.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       move-object/from16 v5, v4
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d
new file mode 100644
index 0000000..94acfb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_5.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       const v1, 1234
+       move-object/from16 v0, v1
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d
new file mode 100644
index 0000000..d41f1f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_6.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const-wide v4500, 123
+       move-object/from16 v0, v4500
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d
new file mode 100644
index 0000000..09abc65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_7.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+
+       const-wide v1234, 123
+       move-object/from16 v255, v1235
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d
new file mode 100644
index 0000000..93ff685
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_object_from16_8.java
+.class public dot.junit.opcodes.move_object_from16.d.T_move_object_from16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       move-object/from16 v124, v4999
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/Test_move_result.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/Test_move_result.java
new file mode 100644
index 0000000..9a0eaba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/Test_move_result.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_result.d.T_move_result_1;
+
+public class Test_move_result extends DxTestCase {
+    /**
+     * @title tests move-result functionality
+     */
+    public void testN1() {
+        assertTrue(T_move_result_1.run());
+    }
+
+
+    /**
+     * @constraint A23 
+     * @title number of registers - dest is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title  reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title wide
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B19 
+     * @title  move-result instruction must be immediately preceded 
+     * (in the insns array) by an <invoke-kind> instruction
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B20 
+     * @title move-result instruction must be immediately preceded 
+     * (in actual control flow) by an <invoke-kind> instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result.d.T_move_result_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.d
new file mode 100644
index 0000000..50c2eb2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.d
@@ -0,0 +1,55 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_1.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 16
+
+    const v0, 0
+    
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_1/foo()I
+
+    move-result v0
+    const v1, 12345
+    
+    if-eq v0, v1 Label1
+    
+    const v0, 0
+    return v0
+    
+Label1:
+    const v0, 1
+    return v0
+
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.java
new file mode 100644
index 0000000..0f97613
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result.d;
+
+public class T_move_result_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_2.d
new file mode 100644
index 0000000..ad1b45c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_2.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_2.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_2/foo()I
+    move-result v16
+    
+    return-void
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_3.d
new file mode 100644
index 0000000..481f158
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_3.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result/d/T_move_result_3/foo()Ljava/lang/Object;
+    move-result v0
+    
+    return-void
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_4.d
new file mode 100644
index 0000000..655aa7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_4.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_4.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result/d/T_move_result_4/foo()J
+    move-result v0
+    
+    return-void
+.end method
+
+.method private foo()J
+.limit regs 2
+
+    const-wide v0, 1234
+    return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_5.d
new file mode 100644
index 0000000..711b142
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_5.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_5.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 16
+
+    const-wide v0, 123
+
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_5/foo()I
+    move-result v1
+    
+    return-wide v0
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_6.d
new file mode 100644
index 0000000..9afeb48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_6.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_6.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_6/foo()I
+    nop
+    move-result v1
+    
+    return-void
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_7.d
new file mode 100644
index 0000000..aaea908
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_7.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_7.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    goto Label1
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_7/foo()I
+Label1:
+    move-result v1
+    
+    return-void
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_8.d
new file mode 100644
index 0000000..da32cd0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result/d/T_move_result_8.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_8.java
+.class public dot.junit.opcodes.move_result.d.T_move_result_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    const v0, 0
+    
+    invoke-static {} dot/junit/opcodes/move_result/d/T_move_result_8/foo()I
+
+    move-result v16
+    return-void
+
+.end method
+
+.method private static foo()I
+.limit regs 1
+
+     const v0, 12345
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java
new file mode 100644
index 0000000..9ee2ed1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_result_object.d.T_move_result_object_1;
+import dot.junit.opcodes.move_result_object.d.T_move_result_object_8;
+
+public class Test_move_result_object extends DxTestCase {
+    /**
+     * @title tests move-result-object functionality
+     */
+    public void testN1() {
+        T_move_result_object_1 t = new T_move_result_object_1();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title filled-new-array result
+     */
+    public void testN2() {
+        T_move_result_object_8 t = new T_move_result_object_8();
+        int[] arr = t.run();
+        if(arr.length != 2 || arr[0] != 1 || arr[1] != 2)
+            fail("wrong array size or content");
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers - dest is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title integer
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title wide
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B19 
+     * @title  move-result-object instruction must be immediately preceded 
+     * (in the insns array) by an <invoke-kind> instruction
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B20
+     * @title move-result-object instruction must be immediately preceded 
+     * (in actual control flow) by an <invoke-kind> instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_object.d.T_move_result_object_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d
new file mode 100644
index 0000000..433b86f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_1.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 16
+
+    const v0, 0
+    
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_1/foo()Ljava/lang/Object;
+
+    move-result-object v0
+    
+    if-eq v0, v15, Label1
+
+    const v0, 0
+    return v0
+    
+Label1:
+    const v0, 1
+    return v0
+
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java
new file mode 100644
index 0000000..76cdb0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result_object.d;
+
+public class T_move_result_object_1 {
+
+    public boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d
new file mode 100644
index 0000000..22c1b0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_2.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_2/foo()Ljava/lang/Object;
+    move-result-object v16
+    
+    return-void
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d
new file mode 100644
index 0000000..a788844
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_3.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_3/foo()I
+    move-result-object v0
+    
+    return-void
+.end method
+
+.method private foo()I
+.limit regs 1
+     const v0, 1
+     return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d
new file mode 100644
index 0000000..b3229b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_4.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_4/foo()J
+    move-result-object v0
+    
+    return-void
+.end method
+
+.method private foo()J
+.limit regs 2
+
+    const-wide v0, 1234
+    return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d
new file mode 100644
index 0000000..6216f18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_5.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 16
+
+    const-wide v0, 123
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_5/foo()Ljava/lang/Object;
+    move-result-object v1
+    
+    return-wide v0
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d
new file mode 100644
index 0000000..8de3274
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_6.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_6/foo()Ljava/lang/Object;
+    nop
+    move-result-object v1
+    
+    return-void
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d
new file mode 100644
index 0000000..088b386
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_object_7.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    goto Label1
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_7/foo()Ljava/lang/Object;
+Label1:
+    move-result-object v1
+    
+    return-void
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d
new file mode 100644
index 0000000..0cbb044
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_8.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()[I
+.limit regs 16
+    const v1, 1
+    const v2, 2
+    filled-new-array {v1, v2}, [I
+    move-result-object v5
+    
+    return-object v5
+
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java
new file mode 100644
index 0000000..3eb0ea1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result_object.d;
+
+public class T_move_result_object_8 {
+
+    public int[] run() {
+        int arr[] = new int[2];
+        arr[0] = 1;
+        arr[1] = 2;
+        return arr;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d
new file mode 100644
index 0000000..92600b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_9.java
+.class public dot.junit.opcodes.move_result_object.d.T_move_result_object_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+    
+    invoke-direct {v15} dot/junit/opcodes/move_result_object/d/T_move_result_object_9/foo()Ljava/lang/Object;
+
+    move-result-object v16
+    return-void
+
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java
new file mode 100644
index 0000000..6c849dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_result_wide.d.T_move_result_wide_1;
+
+public class Test_move_result_wide extends DxTestCase {
+    /**
+     * @title tests move-result-wide functionality
+     */
+    public void testN1() {
+        assertTrue(T_move_result_wide_1.run());
+    }
+
+
+    /**
+     * @constraint A23 
+     * @title  number of registers - dest is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1 
+     * @title reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  32-bit value
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B19 
+     * @title move-result-wide instruction must be immediately preceded 
+     * (in the insns array) by an <invoke-kind> instruction
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B20 
+     * @title move-result-wide instruction must be immediately preceded 
+     * (in actual control flow) by an <invoke-kind> instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.move_result_wide.d.T_move_result_wide_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d
new file mode 100644
index 0000000..e0d80c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d
@@ -0,0 +1,56 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_1.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 16
+
+    const v0, 0
+    
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1/foo()J
+
+    move-result-wide v0
+    const-wide v2, 12345
+    
+    cmp-long v5, v0, v2
+    if-eqz v5, Label1
+    
+    const v0, 0
+    return v0
+    
+Label1:
+    const v0, 1
+    return v0
+
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java
new file mode 100644
index 0000000..4c7ef16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_result_wide.d;
+
+public class T_move_result_wide_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d
new file mode 100644
index 0000000..35eb63c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_2.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2/foo()J
+    move-result-wide v16
+    
+    return-void
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d
new file mode 100644
index 0000000..5f53fa3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_3.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3/foo()Ljava/lang/Object;
+    move-result-wide v0
+    
+    return-void
+.end method
+
+.method private foo()Ljava/lang/Object;
+.limit regs 1
+
+     return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d
new file mode 100644
index 0000000..3c10cab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_4.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 16
+
+    invoke-direct {v15} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4/foo()I
+    move-result-wide v0
+    
+    return-void
+.end method
+
+.method private foo()I
+.limit regs 2
+
+    const v0, 1234
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d
new file mode 100644
index 0000000..9126ee2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_5.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 16
+
+    const-wide v0, 123
+
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5/foo()J
+    move-result-wide v1
+    
+    return-wide v0
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d
new file mode 100644
index 0000000..a499958
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_6.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6/foo()J
+    nop
+    move-result-wide v1
+    
+    return-void
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d
new file mode 100644
index 0000000..f6d47eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_7.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    goto Label1
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7/foo()J
+Label1:
+    move-result-wide v1
+    
+    return-void
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d
new file mode 100644
index 0000000..f385a2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_move_result_wide_8.java
+.class public dot.junit.opcodes.move_result_wide.d.T_move_result_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 16
+
+    const v0, 0
+    
+    invoke-static {} dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8/foo()J
+
+    move-result-wide v16
+    return-void
+
+.end method
+
+.method private static foo()J
+.limit regs 2
+
+     const-wide v0, 12345
+     return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/Test_move_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/Test_move_wide.java
new file mode 100644
index 0000000..4ab7421
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/Test_move_wide.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_wide.d.T_move_wide_1;
+import dot.junit.opcodes.move_wide.d.T_move_wide_6;
+
+public class Test_move_wide extends DxTestCase {
+    /**
+     * @title tests move-wide functionality
+     */
+    public void testN1() {
+        assertTrue(T_move_wide_1.run());
+    }
+
+    
+    /**
+     * @title v0 -> v1
+     */
+    public void testN2() {
+        assertEquals(T_move_wide_6.run(), 0);
+    }
+
+    /**
+     * @constraint A24
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide.d.T_move_wide_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide.d.T_move_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide.d.T_move_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  src register contains 32-bit value
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide.d.T_move_wide_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide.d.T_move_wide_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d
new file mode 100644
index 0000000..b0597f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_1.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 16
+       const-wide v0, 1234
+       const-wide v14, 567989
+
+       move-wide v0, v14
+       
+       const-wide v4, 567989
+
+       cmp-long v10, v0, v4
+       if-nez v10, Label0
+       cmp-long v10, v14, v4
+       if-nez v10, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java
new file mode 100644
index 0000000..8ddde82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide.d;
+
+public class T_move_wide_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d
new file mode 100644
index 0000000..22e992b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_2.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 9
+
+       move-wide v0, v9
+
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d
new file mode 100644
index 0000000..b8e3db0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_3.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 9
+       const-wide v0, 0
+
+       move v9, v0
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d
new file mode 100644
index 0000000..3eb95df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_4.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 9
+       move-wide v1, v8
+
+       const v1, 0
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d
new file mode 100644
index 0000000..92e67dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_5.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 9
+       const v0, 124
+
+       move-wide v5, v0
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d
new file mode 100644
index 0000000..4fecf88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_6.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()I
+.limit regs 9
+       const-wide v0, 1233746384323
+
+       move-wide v1, v0
+       
+       const-wide v4, 1233746384323
+       cmp-long v8, v1, v4
+       
+       return v8
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java
new file mode 100644
index 0000000..bd5de04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide.d;
+
+public class T_move_wide_6 {
+
+    public static int run() {
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d
new file mode 100644
index 0000000..9324fef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_7.java
+.class public dot.junit.opcodes.move_wide.d.T_move_wide_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 9
+       const-wide v0, 124
+       const-wide v5, 0
+
+       move-wide v1, v5
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java
new file mode 100644
index 0000000..a2b776d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_wide_16.d.T_move_wide_16_1;
+import dot.junit.opcodes.move_wide_16.d.T_move_wide_16_9;
+
+public class Test_move_wide_16 extends DxTestCase {
+    /**
+     * @title v4001 -> v4000
+     */
+    public void testN1() {
+        assertTrue(T_move_wide_16_1.run());
+    }
+    
+    /**
+     * @title v1 -> v4001
+     */
+    public void testN2() {
+        assertTrue(T_move_wide_16_1.run());
+    }
+    
+    /**
+     * @title v1 -> v2
+     */
+    public void testN3() {
+        assertEquals(T_move_wide_16_9.run(), 0);
+    }
+
+    /**
+     * @constraint A24
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains 32-bit value
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_16.d.T_move_wide_16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d
new file mode 100644
index 0000000..282edb4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d
@@ -0,0 +1,55 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_1.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const-wide v0, 123
+       const-wide v2, 5678
+       
+       move-wide/16 v4000, v0
+       move-wide/16 v4002, v2
+       
+       move-wide/16 v4000, v4002
+       
+       const-wide v4, 5678
+       
+       move-wide/16 v0, v4000
+       move-wide/16 v2, v4002
+
+       cmp-long v10, v0, v4
+       if-nez v10, Label0
+       cmp-long v10, v2, v4
+       if-nez v10, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java
new file mode 100644
index 0000000..66b4da1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_16.d;
+
+public class T_move_wide_16_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d
new file mode 100644
index 0000000..57c7c93
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_2.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const-wide/16 v2, 5678
+       
+       move-wide/16 v4001, v2
+       move-wide/16 v0, v4001
+       
+       const-wide v4, 5678
+
+       cmp-long v10, v2, v4
+       if-nez v10, Label0
+       cmp-long v10, v0, v4
+       if-nez v10, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java
new file mode 100644
index 0000000..e5f4966
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_16.d;
+
+public class T_move_wide_16_2 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d
new file mode 100644
index 0000000..e1e0ac7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_3.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       move-wide/16 v0, v5000
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d
new file mode 100644
index 0000000..3f12810
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_4.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const-wide v0, 0
+       move-wide/16 v5000, v0
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d
new file mode 100644
index 0000000..7e61df4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_5.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move-wide/16 v0, v4999
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d
new file mode 100644
index 0000000..2cea620
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_6.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const v123, 123
+       move-wide/16 v255, v123
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d
new file mode 100644
index 0000000..7826131
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_7.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+
+       const-wide v123, 123
+       move-wide/16 v255, v124
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d
new file mode 100644
index 0000000..c5e006d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_8.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       const-wide v0, 0
+       move-wide/16 v124, v0
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d
new file mode 100644
index 0000000..aa8cdce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_16_9.java
+.class public dot.junit.opcodes.move_wide_16.d.T_move_wide_16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()I
+.limit regs 5000
+       const-wide v1, 1233746384323
+       move-wide/16 v2, v1
+
+       const-wide v10, 1233746384323
+       cmp-long v4, v2, v10
+
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java
new file mode 100644
index 0000000..f66146b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_16.d;
+
+public class T_move_wide_16_9 {
+
+    public static int run() {
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java
new file mode 100644
index 0000000..2434e92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_from16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_1;
+import dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_2;
+
+public class Test_move_wide_from16 extends DxTestCase {
+    /**
+     * @title v4001 -> v255 -> v1
+     */
+    public void testN1() {
+        assertTrue(T_move_wide_from16_1.run());
+    }
+    
+    /**
+     * @title v100 -> 101
+     */
+    public void testN2() {
+        assertEquals(T_move_wide_from16_2.run(), 0);
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers - src is not valid
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers - dst is not valid
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title src register contains reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register contains 32-bit value
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title src register is a part of reg pair
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B18 
+     * @title When writing to a register that is one half of a 
+     * register pair, but not touching the other half, the old register pair gets broken 
+     * up, and the other register involved in it becomes undefined.
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d
new file mode 100644
index 0000000..21aaca8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_1.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       const-wide v10, 5678233453
+   
+       move-wide/16 v4001, v10
+       
+       move-wide/from16 v255, v4001
+       move-wide/from16 v1, v255
+       
+       const-wide v4, 5678233453
+       
+       cmp-long v0, v1, v4
+       if-nez v0, Label0
+       
+       const v1, 1
+       return v1
+
+Label0:
+       const v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java
new file mode 100644
index 0000000..8dfcd57
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_from16.d;
+
+public class T_move_wide_from16_1 {
+
+    public static boolean run() {
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d
new file mode 100644
index 0000000..d2e6700
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d
@@ -0,0 +1,39 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_2.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()I
+.limit regs 5000
+       const-wide v100, 5678233453
+       move-wide/from16 v101, v100
+       
+       const-wide v4, 5678233453
+       
+       cmp-long v0, v101, v4
+
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java
new file mode 100644
index 0000000..b320731
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.move_wide_from16.d;
+
+public class T_move_wide_from16_2 {
+
+    public static int run() {
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d
new file mode 100644
index 0000000..8f95101
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_3.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5000
+       move-wide/from16 v0, v5000
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d
new file mode 100644
index 0000000..e5f282a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_4.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()Z
+.limit regs 5
+       const v1, 0    
+       move-wide/from16 v5, v1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d
new file mode 100644
index 0000000..21ec075
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_5.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5000
+       move-wide/from16 v0, v4999
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d
new file mode 100644
index 0000000..784e31a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_6.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+       const v4500, 123
+       move-wide/from16 v0, v4500
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d
new file mode 100644
index 0000000..1790fe5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_7.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()V
+.limit regs 5000
+
+       const-wide v1234, 123
+       move-wide/from16 v255, v1235
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d
new file mode 100644
index 0000000..80d80e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_move_wide_from16_8.java
+.class public dot.junit.opcodes.move_wide_from16.d.T_move_wide_from16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()J
+.limit regs 5000
+
+       const-wide v123, 123
+       const-wide v0, 0
+       move-wide/from16 v124, v0
+       return-wide v123
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/Test_mul_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/Test_mul_double.java
new file mode 100644
index 0000000..9a63412
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/Test_mul_double.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_double.d.T_mul_double_1;
+import dot.junit.opcodes.mul_double.d.T_mul_double_4;
+
+public class Test_mul_double extends DxTestCase {
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+
+    public void testN1() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(8.478000000000002d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(-0d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, -3.14d
+     */
+    public void testN3() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(8.478000000000002d, t.run(-3.14d, -2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this multiplication of long and long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_double_4 t = new T_mul_double_4();
+        try {
+            t.run(500000l, 2.7d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, 0
+     */
+    public void testB2() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, 0));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = +0, -0d
+     */
+    public void testB5() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(-0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(+0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB7() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.MAX_VALUE,
+                Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, -1.4E-45f
+     */
+    public void testB8() {
+        T_mul_double_1 t = new T_mul_double_1();
+        assertEquals(-0d, t.run(Double.MIN_VALUE, -1.4E-45f));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double.d.T_mul_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double.d.T_mul_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double.d.T_mul_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d
new file mode 100644
index 0000000..8f7a9a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_1.java
+.class public dot.junit.opcodes.mul_double.d.T_mul_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java
new file mode 100644
index 0000000..a70f250
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double.d;
+
+public class T_mul_double_1 {
+
+    public double run(double a, double b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d
new file mode 100644
index 0000000..99dd815
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2.java
+.class public dot.junit.opcodes.mul_double.d.T_mul_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double v0, v10, v14
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d
new file mode 100644
index 0000000..54a26c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_3.java
+.class public dot.junit.opcodes.mul_double.d.T_mul_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)D
+.limit regs 14
+
+       mul-double v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d
new file mode 100644
index 0000000..54df7a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_4.java
+.class public dot.junit.opcodes.mul_double.d.T_mul_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 14
+
+       mul-double v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java
new file mode 100644
index 0000000..a707538
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double.d;
+
+public class T_mul_double_4 {
+
+    public double run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d
new file mode 100644
index 0000000..d3d6ec3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_5.java
+.class public dot.junit.opcodes.mul_double.d.T_mul_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double v0, v9, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java
new file mode 100644
index 0000000..2637e18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_1;
+import dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_4;
+
+public class Test_mul_double_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+
+    public void testN1() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(8.478000000000002d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(-0d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, -3.14d
+     */
+    public void testN3() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(8.478000000000002d, t.run(-3.14d, -2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this multiplication of long and long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_double_2addr_4 t = new T_mul_double_2addr_4();
+        try {
+            t.run(500000l, 2.7d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, 0
+     */
+    public void testB2() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, 0));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = +0, -0d
+     */
+    public void testB5() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(-0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(+0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB7() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.MAX_VALUE,
+                Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, -1.4E-45f
+     */
+    public void testB8() {
+        T_mul_double_2addr_1 t = new T_mul_double_2addr_1();
+        assertEquals(-0d, t.run(Double.MIN_VALUE, -1.4E-45f));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d
new file mode 100644
index 0000000..373a854
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2addr_1.java
+.class public dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java
new file mode 100644
index 0000000..f5bdb4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double_2addr.d;
+
+public class T_mul_double_2addr_1 {
+
+    public double run(double a, double b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d
new file mode 100644
index 0000000..05485d8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2addr_2.java
+.class public dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double/2addr v10, v14
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d
new file mode 100644
index 0000000..d981779
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2addr_3.java
+.class public dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)D
+.limit regs 14
+
+       mul-double/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d
new file mode 100644
index 0000000..1654300
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2addr_4.java
+.class public dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 14
+
+       mul-double/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java
new file mode 100644
index 0000000..8a17e15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_double_2addr.d;
+
+public class T_mul_double_2addr_4 {
+
+    public double run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d
new file mode 100644
index 0000000..ef36f48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_double_2addr_5.java
+.class public dot.junit.opcodes.mul_double_2addr.d.T_mul_double_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       mul-double/2addr v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/Test_mul_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/Test_mul_float.java
new file mode 100644
index 0000000..6359122
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/Test_mul_float.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_float.d.T_mul_float_1;
+import dot.junit.opcodes.mul_float.d.T_mul_float_6;
+
+public class Test_mul_float extends DxTestCase {
+    
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(8.478001f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(-0f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, -3.14f
+     */
+    public void testN3() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(8.478001f, t.run(-3.14f, -2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_float_6 t = new T_mul_float_6();
+        try {
+            t.run(3.12f, 13);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, 0
+     */
+    public void testB2() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, 0));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(-0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(+0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB7() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB8() {
+        T_mul_float_1 t = new T_mul_float_1();
+        assertEquals(-0f, t.run(Float.MIN_VALUE, -1.4E-45f));
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float.d.T_mul_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float.d.T_mul_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float.d.T_mul_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float.d.T_mul_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d
new file mode 100644
index 0000000..8be7048
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_1.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java
new file mode 100644
index 0000000..4010691
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float.d;
+
+public class T_mul_float_1 {
+
+    public float run(float a, float b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d
new file mode 100644
index 0000000..2647599
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_2.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float v0, v6, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d
new file mode 100644
index 0000000..13a31f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_3.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)F
+.limit regs 8
+
+       mul-float v0, v5, v6
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d
new file mode 100644
index 0000000..a92ef8f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_4.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)F
+.limit regs 8
+
+       mul-float v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d
new file mode 100644
index 0000000..9f99d59
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d
@@ -0,0 +1,18 @@
+.source T_mul_float_5.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d
new file mode 100644
index 0000000..7b3b61a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d
@@ -0,0 +1,18 @@
+.source T_mul_float_6.java
+.class public dot.junit.opcodes.mul_float.d.T_mul_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)F
+.limit regs 8
+
+       mul-float v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java
new file mode 100644
index 0000000..abccc0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float.d;
+
+public class T_mul_float_6 {
+
+    public float run(float a, int b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java
new file mode 100644
index 0000000..0686a9b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_1;
+import dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_6;
+
+public class Test_mul_float_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(8.478001f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(-0f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, -3.14f
+     */
+    public void testN3() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(8.478001f, t.run(-3.14f, -2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_float_2addr_6 t = new T_mul_float_2addr_6();
+        try {
+            t.run(3.12f, 13);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, 0
+     */
+    public void testB2() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, 0));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(-0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(+0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB7() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB8() {
+        T_mul_float_2addr_1 t = new T_mul_float_2addr_1();
+        assertEquals(-0f, t.run(Float.MIN_VALUE, -1.4E-45f));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d
new file mode 100644
index 0000000..05faaba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_mul_float_2addr_1.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java
new file mode 100644
index 0000000..1f6b647
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float_2addr.d;
+
+public class T_mul_float_2addr_1 {
+
+    public float run(float a, float b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d
new file mode 100644
index 0000000..11fef7b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_2addr_2.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float/2addr v6, v8
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d
new file mode 100644
index 0000000..9d83fef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_2addr_3.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)F
+.limit regs 8
+
+       mul-float/2addr v5, v6
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d
new file mode 100644
index 0000000..eebb510
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_float_2addr_4.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)F
+.limit regs 8
+
+       mul-float/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d
new file mode 100644
index 0000000..03a888b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_mul_float_2addr_5.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       mul-float/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d
new file mode 100644
index 0000000..67cccbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_mul_float_2addr_6.java
+.class public dot.junit.opcodes.mul_float_2addr.d.T_mul_float_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)F
+.limit regs 8
+
+       mul-float/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java
new file mode 100644
index 0000000..f580894
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_float_2addr.d;
+
+public class T_mul_float_2addr_6 {
+
+    public float run(float a, int b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/Test_mul_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/Test_mul_int.java
new file mode 100644
index 0000000..f9252c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/Test_mul_int.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_int.d.T_mul_int_1;
+import dot.junit.opcodes.mul_int.d.T_mul_int_6;
+
+public class Test_mul_int extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(32, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = -2, 255
+     */
+    public void testN2() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(-510, t.run(-2, 255));
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe, 2
+     */
+    public void testN3() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(-4, t.run(0x7ffffffe, 2));
+    }
+
+    /**
+     * @title Arguments = 4, 0x80000001
+     */
+    public void testN4() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(4, t.run(4, 0x80000001));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_mul_int_6 t = new T_mul_int_6();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(0, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB2() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB3() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE,
+                Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_mul_int_1 t = new T_mul_int_1();
+        assertEquals(0, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int.d.T_mul_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int.d.T_mul_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int.d.T_mul_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int.d.T_mul_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d
new file mode 100644
index 0000000..3b4a63f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_1.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 9
+
+       mul-int v0, v7, v8
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java
new file mode 100644
index 0000000..4ac3bea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int.d;
+
+public class T_mul_int_1 {
+
+    public int run(int a, int b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d
new file mode 100644
index 0000000..ed71fa1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       mul-int v0, v7, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d
new file mode 100644
index 0000000..059f7b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_3.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 9
+
+       mul-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d
new file mode 100644
index 0000000..67c0e37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_4.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 9
+
+       mul-int v0, v6, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d
new file mode 100644
index 0000000..04be572
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_5.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 9
+
+       mul-int v0, v6, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d
new file mode 100644
index 0000000..e181e71
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_6.java
+.class public dot.junit.opcodes.mul_int.d.T_mul_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 9
+
+       mul-int v0, v7, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java
new file mode 100644
index 0000000..a4e6a07
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int.d;
+
+public class T_mul_int_6 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java
new file mode 100644
index 0000000..010896c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_1;
+import dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_6;
+
+public class Test_mul_int_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(32, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = -2, 255
+     */
+    public void testN2() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(-510, t.run(-2, 255));
+    }
+
+    /**
+     * @title Arguments = 0x7ffffffe, 2
+     */
+    public void testN3() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(-4, t.run(0x7ffffffe, 2));
+    }
+
+    /**
+     * @title Arguments = 4, 0x80000001
+     */
+    public void testN4() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(4, t.run(4, 0x80000001));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_mul_int_2addr_6 t = new T_mul_int_2addr_6();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(0, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB2() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB3() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE,
+                Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_mul_int_2addr_1 t = new T_mul_int_2addr_1();
+        assertEquals(0, t.run(0, 0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d
new file mode 100644
index 0000000..86a6c9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_1.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       mul-int/2addr v6, v7
+       return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java
new file mode 100644
index 0000000..b4878b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_2addr.d;
+
+public class T_mul_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d
new file mode 100644
index 0000000..744c214
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_2.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       mul-int/2addr v7, v8
+       return v7
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d
new file mode 100644
index 0000000..8c14a36
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_3.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       mul-int/2addr v5, v6
+       return v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d
new file mode 100644
index 0000000..64e0ba1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_4.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       mul-int/2addr v5, v7
+       return v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d
new file mode 100644
index 0000000..9a22395
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_5.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       mul-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d
new file mode 100644
index 0000000..c8bbcd2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_2addr_6.java
+.class public dot.junit.opcodes.mul_int_2addr.d.T_mul_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 8
+
+       mul-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java
new file mode 100644
index 0000000..71f6655
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_2addr.d;
+
+public class T_mul_int_2addr_6 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java
new file mode 100644
index 0000000..d77dd0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_1;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_2;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_3;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_4;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_5;
+import dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_6;
+
+public class Test_mul_int_lit16 extends DxTestCase {
+
+    /**
+     * @title Arguments = 205, 130
+     */
+    public void testN1() {
+        T_mul_int_lit16_1 t = new T_mul_int_lit16_1();
+        assertEquals(26650, t.run(205));
+    }
+
+    /**
+     * @title Arguments = -180, 130
+     */
+    public void testN2() {
+        T_mul_int_lit16_1 t = new T_mul_int_lit16_1();
+        assertEquals(-23400, t.run(-180));
+    }
+
+    /**
+     * @title Arguments = 0xfa, 130
+     */
+    public void testN3() {
+        T_mul_int_lit16_1 t = new T_mul_int_lit16_1();
+        assertEquals(0x7ef4, t.run(0xfa));
+    }
+
+    /**
+     * @title Arguments = -101, -321
+     */
+    public void testN4() {
+        T_mul_int_lit16_2 t = new T_mul_int_lit16_2();
+        assertEquals(32421, t.run(-101));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_mul_int_lit16_3 t = new T_mul_int_lit16_3();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, 0 
+     */
+    public void testB1() {
+        T_mul_int_lit16_4 t = new T_mul_int_lit16_4();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Arguments = 0, Short.MAX_VALUE
+     */
+    public void testB2() {
+        T_mul_int_lit16_4 t = new T_mul_int_lit16_4();
+        assertEquals(0, t.run(Short.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Short.MAX_VALUE
+     */
+    public void testB3() {
+        T_mul_int_lit16_5 t = new T_mul_int_lit16_5();
+        assertEquals(Short.MAX_VALUE, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 1, Short.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_int_lit16_5 t = new T_mul_int_lit16_5();
+        assertEquals(Short.MIN_VALUE, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 32767, Short.MIN_VALUE
+     */
+    public void testB5() {
+        T_mul_int_lit16_6 t = new T_mul_int_lit16_6();
+        assertEquals(-1073709056, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int * double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long * int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference * int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d
new file mode 100644
index 0000000..d7dd6f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_1.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, 130
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java
new file mode 100644
index 0000000..e4b1503
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_1 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d
new file mode 100644
index 0000000..91c550c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_10.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v7, 4321
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java
new file mode 100644
index 0000000..54d82de
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_10 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d
new file mode 100644
index 0000000..200afbe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_2.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, -321
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java
new file mode 100644
index 0000000..33fab36
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_2 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d
new file mode 100644
index 0000000..aed3dd4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_3.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, 130
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java
new file mode 100644
index 0000000..959ac8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_3 {
+    
+    public int run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d
new file mode 100644
index 0000000..532ce52
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_4.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java
new file mode 100644
index 0000000..e4abf30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_4 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d
new file mode 100644
index 0000000..0d4d3ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_5.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java
new file mode 100644
index 0000000..4ca4f63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_5 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d
new file mode 100644
index 0000000..a719ab3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_6.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v8, 32767
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java
new file mode 100644
index 0000000..d926570
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_6 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d
new file mode 100644
index 0000000..511de2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_7.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit16 v0, v9, 3276
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java
new file mode 100644
index 0000000..a891dd9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_7 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d
new file mode 100644
index 0000000..288f649
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_8.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 9
+
+       mul-int/lit16 v0, v7, 4321
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java
new file mode 100644
index 0000000..d639850
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_8 {
+    
+    public int run(double a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d
new file mode 100644
index 0000000..e8d0737
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit16_9.java
+.class public dot.junit.opcodes.mul_int_lit16.d.T_mul_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 9
+
+       mul-int/lit16 v0, v7, 4321
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java
new file mode 100644
index 0000000..b7f8085
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit16.d;
+
+public class T_mul_int_lit16_9 {
+    
+    public int run(long a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java
new file mode 100644
index 0000000..e2dae07
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_1;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_2;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_3;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_4;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_5;
+import dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_6;
+
+public class Test_mul_int_lit8 extends DxTestCase {
+    
+    /**
+     * @title Arguments =  10, 55
+     */
+    public void testN1() {
+        T_mul_int_lit8_1 t = new T_mul_int_lit8_1();
+        assertEquals(550, t.run(55));
+    }
+
+    /**
+     * @title Arguments = 10, -25 
+     */
+    public void testN2() {
+        T_mul_int_lit8_1 t = new T_mul_int_lit8_1();
+        assertEquals(-250, t.run(-25));
+    }
+
+    /**
+     * @title Arguments = -15, -23
+     */
+    public void testN3() {
+        T_mul_int_lit8_2 t = new T_mul_int_lit8_2();
+        assertEquals(345, t.run(-23));
+    }
+    
+    /**
+     * @title Arguments = 0x7ffffffe, 10
+     */
+    public void testN4() {
+        T_mul_int_lit8_1 t = new T_mul_int_lit8_1();
+        assertEquals(-20, t.run(0x7ffffffe));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_mul_int_lit8_3 t = new T_mul_int_lit8_3();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB1() {
+        T_mul_int_lit8_4 t = new T_mul_int_lit8_4();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Arguments = 0, Byte.MAX_VALUE
+     */
+    public void testB2() {
+        T_mul_int_lit8_4 t = new T_mul_int_lit8_4();
+        assertEquals(0, t.run(Byte.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Byte.MAX_VALUE
+     */
+    public void testB3() {
+        T_mul_int_lit8_5 t = new T_mul_int_lit8_5();
+        assertEquals(Byte.MAX_VALUE, t.run(Byte.MAX_VALUE));
+    }
+    
+    /**
+     * @title Arguments = 1, Short.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_int_lit8_5 t = new T_mul_int_lit8_5();
+        assertEquals(Short.MIN_VALUE, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 127, Short.MIN_VALUE
+     */
+    public void testB5() {
+        T_mul_int_lit8_6 t = new T_mul_int_lit8_6();
+        assertEquals(-4161536, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int * double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long * int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title types of arguments - reference * int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d
new file mode 100644
index 0000000..8aebfd4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_1.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java
new file mode 100644
index 0000000..dd87288
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_1 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d
new file mode 100644
index 0000000..716726e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_10.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v7, 111
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java
new file mode 100644
index 0000000..a50d3d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_10 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d
new file mode 100644
index 0000000..c4d9174
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_2.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, -15
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java
new file mode 100644
index 0000000..97e30cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_2 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d
new file mode 100644
index 0000000..fc70d45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_3.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java
new file mode 100644
index 0000000..dc7352a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_3 {
+    
+    public int run(float a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d
new file mode 100644
index 0000000..a9cf5e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_4.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java
new file mode 100644
index 0000000..4e395c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_4 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d
new file mode 100644
index 0000000..1e08af2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_5.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java
new file mode 100644
index 0000000..1b7c65f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_5 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d
new file mode 100644
index 0000000..bfcfcc2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_6.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v8, 127
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java
new file mode 100644
index 0000000..6a723c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_6 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d
new file mode 100644
index 0000000..fe88ffb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_7.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 9
+
+       mul-int/lit8 v0, v9, 12
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java
new file mode 100644
index 0000000..34f5fde
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_7 {
+    
+    public int run(int a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d
new file mode 100644
index 0000000..fc6ec8a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_8.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 9
+
+       mul-int/lit8 v0, v7, 123
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java
new file mode 100644
index 0000000..8fb46ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_8 {
+    
+    public int run(double a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d
new file mode 100644
index 0000000..943b9ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_int_lit8_9.java
+.class public dot.junit.opcodes.mul_int_lit8.d.T_mul_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 9
+
+       mul-int/lit8 v0, v7, 123
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java
new file mode 100644
index 0000000..c7ebd3d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_int_lit8.d;
+
+public class T_mul_int_lit8_9 {
+    
+    public int run(long a) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/Test_mul_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/Test_mul_long.java
new file mode 100644
index 0000000..1abf57e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/Test_mul_long.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_long.d.T_mul_long_1;
+import dot.junit.opcodes.mul_long.d.T_mul_long_3;
+
+public class Test_mul_long extends DxTestCase {
+    
+    /**
+     * @title Arguments = 222000000000l, 5000000000l
+     */
+    public void testN1() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(3195355577426903040l, t.run(222000000000l, 5000000000l));
+    }
+
+    /**
+     * @title Arguments = -123456789l, 123456789l
+     */
+    public void testN2() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(-15241578750190521l, t.run(-123456789l, 123456789l));
+    }
+
+    /**
+     * @title Arguments = -123456789l, -123456789l
+     */
+    public void testN3() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(15241578750190521l, t.run(-123456789l, -123456789l));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this multiplication of long and long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_long_3 t = new T_mul_long_3();
+        try {
+            t.run(500000l, 2.7d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(0, t.run(0, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1
+     */
+    public void testB2() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1
+     */
+    public void testB3() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, Long.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE,
+                Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, -1
+     */
+    public void testB6() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(-9223372036854775807L, t.run(Long.MAX_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1
+     */
+    public void testB7() {
+        T_mul_long_1 t = new T_mul_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long.d.T_mul_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long * int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long.d.T_mul_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float * long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long.d.T_mul_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference * long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long.d.T_mul_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d
new file mode 100644
index 0000000..de4736d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_1.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java
new file mode 100644
index 0000000..5cb0074
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long.d;
+
+public class T_mul_long_1 {
+
+    public long run(long a, long b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d
new file mode 100644
index 0000000..4e0d25c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long v0, v12, v14
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d
new file mode 100644
index 0000000..f2faf7d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_3.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       mul-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java
new file mode 100644
index 0000000..ab7743f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long.d;
+
+public class T_mul_long_3 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d
new file mode 100644
index 0000000..bd62f75
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_4.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 14
+
+       mul-long v0, v11, v13
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d
new file mode 100644
index 0000000..3d1d09e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_5.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FJ)J
+.limit regs 14
+
+       mul-long v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d
new file mode 100644
index 0000000..656ec8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_6.java
+.class public dot.junit.opcodes.mul_long.d.T_mul_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long v0, v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java
new file mode 100644
index 0000000..3996c60
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_1;
+import dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_3;
+
+public class Test_mul_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 222000000000l, 5000000000l
+     */
+    public void testN1() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(3195355577426903040l, t.run(222000000000l, 5000000000l));
+    }
+
+    /**
+     * @title Arguments = -123456789l, 123456789l
+     */
+    public void testN2() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(-15241578750190521l, t.run(-123456789l, 123456789l));
+    }
+
+    /**
+     * @title Arguments = -123456789l, -123456789l
+     */
+    public void testN3() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(15241578750190521l, t.run(-123456789l, -123456789l));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this multiplication of long and long makes no sense but shall not crash the VM.  
+     */
+
+    public void testN4() {
+        T_mul_long_2addr_3 t = new T_mul_long_2addr_3();
+        try {
+            t.run(500000l, 2.7d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(0, t.run(0, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1
+     */
+    public void testB2() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1
+     */
+    public void testB3() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, Long.MIN_VALUE
+     */
+    public void testB4() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE,
+                Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, -1
+     */
+    public void testB6() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(-9223372036854775807L, t.run(Long.MAX_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1
+     */
+    public void testB7() {
+        T_mul_long_2addr_1 t = new T_mul_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long * int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float * long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference * long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d
new file mode 100644
index 0000000..1175bf4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_1.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java
new file mode 100644
index 0000000..886761f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long_2addr.d;
+
+public class T_mul_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a*b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d
new file mode 100644
index 0000000..c044257
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_2.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long/2addr v12, v14
+       return-wide v12
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d
new file mode 100644
index 0000000..6735fe5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_3.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       mul-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java
new file mode 100644
index 0000000..122cf54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.mul_long_2addr.d;
+
+public class T_mul_long_2addr_3 {
+
+    public long run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d
new file mode 100644
index 0000000..e708710
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_4.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 14
+
+       mul-long/2addr v11, v13
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d
new file mode 100644
index 0000000..365e8ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_5.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FJ)J
+.limit regs 14
+
+       mul-long/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d
new file mode 100644
index 0000000..bd6d465
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_mul_long_2addr_6.java
+.class public dot.junit.opcodes.mul_long_2addr.d.T_mul_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       mul-long/2addr v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/Test_neg_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/Test_neg_double.java
new file mode 100644
index 0000000..53fe02b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/Test_neg_double.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.neg_double.d.T_neg_double_1;
+import dot.junit.opcodes.neg_double.d.T_neg_double_4;
+
+public class Test_neg_double extends DxTestCase {
+    
+    /**
+     * @title Argument = 1
+     */
+    public void testN1() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(-1d, t.run(1d));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN2() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(1d, t.run(-1d));
+    }
+
+    /**
+     * @title Argument = +0
+     */
+    public void testN3() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(-0d, t.run(+0d));
+    }
+
+    /**
+     * @title Argument = -2.7
+     */
+    public void testN4() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(2.7d, t.run(-2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of long and double makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_neg_double_4 t = new T_neg_double_4();
+        try {
+            t.run(500000l);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Argument = Double.NaN
+     */
+    public void testB1() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(Double.NaN, t.run(Double.NaN));
+    }
+
+    /**
+     * @title Argument = Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = Double.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = Double.MAX_VALUE
+     */
+    public void testB4() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(-1.7976931348623157E308d, t.run(Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Double.MIN_VALUE
+     */
+    public void testB5() {
+        T_neg_double_1 t = new T_neg_double_1();
+        assertEquals(-4.9E-324d, t.run(Double.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_double.d.T_neg_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_double.d.T_neg_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_double.d.T_neg_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_double.d.T_neg_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d
new file mode 100644
index 0000000..b094774
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_double_1.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)D
+.limit regs 8
+
+       neg-double v0, v6
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java
new file mode 100644
index 0000000..dcf3da6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_double.d;
+
+public class T_neg_double_1 {
+
+    public double run(double d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d
new file mode 100644
index 0000000..a99ecff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_double_2.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)D
+.limit regs 8
+
+       neg-double v0, v8
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d
new file mode 100644
index 0000000..26d6715
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_double_3.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)D
+.limit regs 8
+
+       neg-double v0, v7
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d
new file mode 100644
index 0000000..d7a51d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_double_4.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)D
+.limit regs 8
+
+       neg-double v0, v6
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java
new file mode 100644
index 0000000..d7507ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_double.d;
+
+public class T_neg_double_4 {
+
+    public double run(long d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d
new file mode 100644
index 0000000..b8cbb4b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_double_5.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)D
+.limit regs 8
+
+       neg-double v0, v7
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d
new file mode 100644
index 0000000..33e252a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d
@@ -0,0 +1,18 @@
+.source T_neg_double_6.java
+.class public dot.junit.opcodes.neg_double.d.T_neg_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)D
+.limit regs 8
+
+       neg-double v0, v5
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/Test_neg_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/Test_neg_float.java
new file mode 100644
index 0000000..cfd7edf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/Test_neg_float.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.neg_float.d.T_neg_float_1;
+import dot.junit.opcodes.neg_float.d.T_neg_float_6;
+
+public class Test_neg_float extends DxTestCase {
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN1() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(-1f, t.run(1f));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN2() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(1f, t.run(-1f));
+    }
+
+    /**
+     * @title Argument = +0
+     */
+    public void testN3() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(-0f, t.run(+0f));
+    }
+
+    /**
+     * @title Argument = -2.7
+     */
+    public void testN4() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(2.7f, t.run(-2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_neg_float_6 t = new T_neg_float_6();
+        try {
+            t.run(5);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Float.NaN
+     */
+    public void testB1() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(Float.NaN, t.run(Float.NaN));
+    }
+
+    /**
+     * @title Argument = Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = Float.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Argument = Float.MAX_VALUE
+     */
+    public void testB4() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(-3.4028235E38f, t.run(Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Float.MIN
+     */
+    public void testB5() {
+        T_neg_float_1 t = new T_neg_float_1();
+        assertEquals(-1.4E-45f, t.run(Float.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_float.d.T_neg_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_float.d.T_neg_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_float.d.T_neg_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_float.d.T_neg_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d
new file mode 100644
index 0000000..3259f41
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_float_1.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)F
+.limit regs 5
+
+       neg-float v0, v4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java
new file mode 100644
index 0000000..9709099
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_float.d;
+
+public class T_neg_float_1 {
+
+    public float run(float d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d
new file mode 100644
index 0000000..966cbe7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_float_2.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)F
+.limit regs 5
+
+       neg-float v0, v5
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d
new file mode 100644
index 0000000..6c6be2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_float_3.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)F
+.limit regs 5
+
+       neg-float v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d
new file mode 100644
index 0000000..3b9c963
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_float_4.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)F
+.limit regs 5
+
+       neg-float v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d
new file mode 100644
index 0000000..7a391f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d
@@ -0,0 +1,18 @@
+.source T_neg_float_5.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)F
+.limit regs 5
+
+       neg-float v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d
new file mode 100644
index 0000000..897725b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_float_6.java
+.class public dot.junit.opcodes.neg_float.d.T_neg_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)F
+.limit regs 5
+
+       neg-float v0, v4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java
new file mode 100644
index 0000000..f597964
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_float.d;
+
+public class T_neg_float_6 {
+
+    public float run(int d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/Test_neg_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/Test_neg_int.java
new file mode 100644
index 0000000..817e03a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/Test_neg_int.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.neg_int.d.T_neg_int_1;
+import dot.junit.opcodes.neg_int.d.T_neg_int_2;
+import dot.junit.opcodes.neg_int.d.T_neg_int_7;
+
+public class Test_neg_int extends DxTestCase {
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN1() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(-1, t.run(1));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN2() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(1, t.run(-1));
+    }
+
+    /**
+     * @title Argument = 32768
+     */
+    public void testN3() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(-32768, t.run(32768));
+    }
+
+    /**
+     * @title Argument = 0
+     */
+    public void testN4() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Check that -x == (~x + 1)
+     */
+    public void testN5() {
+        T_neg_int_2 t = new T_neg_int_2();
+        assertTrue(t.run(5));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_neg_int_7 t = new T_neg_int_7();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(0x80000001, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_neg_int_1 t = new T_neg_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_int.d.T_neg_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_int.d.T_neg_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_int.d.T_neg_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title  type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_int.d.T_neg_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d
new file mode 100644
index 0000000..0ff47de
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_int_1.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       neg-int v0, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java
new file mode 100644
index 0000000..fc2a24b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_int.d;
+
+public class T_neg_int_1 {
+
+    public int run(int d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d
new file mode 100644
index 0000000..f66368b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d
@@ -0,0 +1,29 @@
+.source T_neg_int_2.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)Z
+.limit regs 7
+
+       neg-int v4, v6
+       
+       not-int v3, v6
+       add-int/lit8 v2, v3, 1
+
+       if-eq v4, v2, Label1
+       const/4 v1, 0
+
+Label15:
+       return v1
+Label1:
+       const/4 v1, 1
+       goto Label15
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java
new file mode 100644
index 0000000..f37b31d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_int.d;
+
+public class T_neg_int_2 {
+
+     public boolean run(int d) {
+         return -d == (~d + 1);
+     }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d
new file mode 100644
index 0000000..90c16f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_int_3.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       neg-int v0, v5
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d
new file mode 100644
index 0000000..4d2c14b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_int_4.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 5
+
+       neg-int v0, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d
new file mode 100644
index 0000000..aa67eff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_int_5.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 5
+
+       neg-int v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d
new file mode 100644
index 0000000..af24f55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d
@@ -0,0 +1,18 @@
+.source T_neg_int_6.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       neg-int v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d
new file mode 100644
index 0000000..b1fc23d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_int_7.java
+.class public dot.junit.opcodes.neg_int.d.T_neg_int_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       neg-int v0, v4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java
new file mode 100644
index 0000000..24e130c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_int.d;
+
+public class T_neg_int_7 {
+
+    public int run(float d) {
+        return -(int)d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/Test_neg_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/Test_neg_long.java
new file mode 100644
index 0000000..f731c64
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/Test_neg_long.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.neg_long.d.T_neg_long_1;
+import dot.junit.opcodes.neg_long.d.T_neg_long_2;
+import dot.junit.opcodes.neg_long.d.T_neg_long_4;
+
+public class Test_neg_long extends DxTestCase {
+ 
+    /**
+     * @title Argument = 123123123272432432l
+     */
+    public void testN1() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(-123123123272432432l, t.run(123123123272432432l));
+    }
+
+    /**
+     * @title Argument = 1
+     */
+    public void testN2() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(-1l, t.run(1l));
+    }
+
+    /**
+     * @title Argument = -1
+     */
+    public void testN3() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(1l, t.run(-1l));
+    }
+
+    /**
+     * @title Check that -x == (~x + 1)
+     */
+    public void testN4() {
+        T_neg_long_2 t = new T_neg_long_2();
+        assertTrue(t.run(15l));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of long and double makes no sense but shall not crash the VM.  
+     */
+
+    public void testN5() {
+        T_neg_long_4 t = new T_neg_long_4();
+        try {
+            t.run(1.23d);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Argument = 0
+     */
+    public void testB1() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Argument = Long.MAX_VALUE
+     */
+    public void testB2() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(-9223372036854775807L, t.run(Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Long.MIN_VALUE
+     */
+    public void testB3() {
+        T_neg_long_1 t = new T_neg_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_long.d.T_neg_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_long.d.T_neg_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_long.d.T_neg_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.neg_long.d.T_neg_long_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d
new file mode 100644
index 0000000..7973f10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_1.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 8
+
+       neg-long v0, v6
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java
new file mode 100644
index 0000000..dea3c8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_long.d;
+
+public class T_neg_long_1 {
+
+    public long run(long d) {
+        return -d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d
new file mode 100644
index 0000000..03891af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d
@@ -0,0 +1,33 @@
+.source T_neg_long_2.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)Z
+.limit regs 14
+
+       neg-long v10, v12
+       
+       not-long v8, v12
+       const-wide v6, 1
+       add-long v4, v6, v8
+
+       cmp-long v3, v4, v10
+       const/4 v1, 0
+       if-eq v1, v3, Label1
+       const/4 v0, 0
+
+Label15:
+       return v0
+Label1:
+       const/4 v0, 1
+       goto Label15
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java
new file mode 100644
index 0000000..dcf67e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_long.d;
+
+public class T_neg_long_2 {
+
+    public boolean run(long d) {
+        return -d == (~d + 1);
+     }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d
new file mode 100644
index 0000000..ab92394
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_3.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 8
+
+       neg-long v0, v8
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d
new file mode 100644
index 0000000..98fe8da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_4.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 8
+
+       neg-long v0, v6
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java
new file mode 100644
index 0000000..20631a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.neg_long.d;
+
+public class T_neg_long_4 {
+
+    public long run(double d) {
+        return -(long)d;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d
new file mode 100644
index 0000000..bd3a364
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_5.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 8
+
+       neg-long v0, v7
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d
new file mode 100644
index 0000000..a936135
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_6.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 8
+
+       neg-long v0, v7
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d
new file mode 100644
index 0000000..66af380
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_neg_long_7.java
+.class public dot.junit.opcodes.neg_long.d.T_neg_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 8
+
+       neg-long v0, v5
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/TestStubs.java
new file mode 100644
index 0000000..587b4d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/TestStubs.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.new_array;
+
+// package access to trigger IllegalAccessError in testVFE8
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/Test_new_array.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/Test_new_array.java
new file mode 100644
index 0000000..44aedaa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/Test_new_array.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_array;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.new_array.d.T_new_array_1;
+import dot.junit.opcodes.new_array.d.T_new_array_10;
+import dot.junit.opcodes.new_array.d.T_new_array_11;
+import dot.junit.opcodes.new_array.d.T_new_array_2;
+import dot.junit.opcodes.new_array.d.T_new_array_3;
+
+public class Test_new_array extends DxTestCase {
+
+    /**
+     * @title Array of ints
+     */
+    public void testN1() {
+        T_new_array_1 t = new T_new_array_1();
+        int[] r = t.run(10);
+        int l = r.length;
+        assertEquals(10, l);
+
+        // check default initialization
+        for (int i = 0; i < l; i++) {
+            assertEquals(0, r[i]);
+        }
+
+    }
+
+    /**
+     * @title Array of booleans
+     */
+    public void testN2() {
+        T_new_array_2 t = new T_new_array_2();
+        boolean[] r = t.run(10);
+        int l = r.length;
+        assertEquals(10, l);
+
+        // check default initialization
+        for (int i = 0; i < l; i++) {
+            assertFalse(r[i]);
+        }
+    }
+
+    /**
+     * @title Array of Objects
+     */
+    public void testN3() {
+        T_new_array_3 t = new T_new_array_3();
+        Object[] r = t.run(10);
+        int l = r.length;
+        assertEquals(10, l);
+
+        // check default initialization
+        for (int i = 0; i < l; i++) {
+            assertNull(r[i]);
+        }
+    }
+
+    /**
+     * @title Array size = 0
+     */
+    public void testB1() {
+        T_new_array_1 t = new T_new_array_1();
+        int[] r = t.run(0);
+        assertNotNull(r);
+        assertEquals(0, r.length);
+    }
+
+    /**
+     * @title expected NegativeArraySizeException
+     */
+    public void testE1() {
+        T_new_array_2 t = new T_new_array_2();
+        try {
+            t.run(-1);
+            fail("expected NegativeArraySizeException");
+        } catch (NegativeArraySizeException nase) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title  size argument - long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title  size argument - reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A19
+     * @title  constant pool index
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A22
+     * @title  attempt to create object
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A20
+     * @title  array of more than 255 dimensions
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.new_array.d.T_new_array_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to instantiate array of non-existent class.
+     */
+    public void testVFE7() {
+        try {
+            new T_new_array_11().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to instantiate array of inaccessible class.
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.new_array.TestStubs
+        try {
+            new T_new_array_10().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.d
new file mode 100644
index 0000000..e681faf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_1.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[I
+.limit regs 5
+
+       new-array v0, v4, [I
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.java
new file mode 100644
index 0000000..7455164
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_array.d;
+
+public class T_new_array_1 {
+
+    public int[] run(int sz) {
+        return new int[sz];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.d
new file mode 100644
index 0000000..4c99085
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_10.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 5
+
+       const v0, 3
+       new-array v0, v0, [Ldot/junit/opcodes/new_array/TestStubs;
+       
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.java
new file mode 100644
index 0000000..81b7a7e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_10.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.new_array.d;
+
+public class T_new_array_10 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.d
new file mode 100644
index 0000000..3f0b3da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_11.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()[Ljava/lang/Object;
+.limit regs 5
+
+       const v0, 3
+       new-array v0, v0, [Ljava/lang/ObjectNNN;
+       
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.java
new file mode 100644
index 0000000..e37e1ec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_11.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.new_array.d;
+
+public class T_new_array_11 {
+    public Object[] run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.d
new file mode 100644
index 0000000..de7b8dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_2.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[Z
+.limit regs 5
+
+       new-array v0, v4, [Z
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.java
new file mode 100644
index 0000000..27103b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_array.d;
+
+public class T_new_array_2 {
+
+    public boolean[] run(int sz) {
+        return new boolean[sz];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.d
new file mode 100644
index 0000000..d560ca6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_3.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[Ljava/lang/Object;
+.limit regs 5
+
+       new-array v0, v4, [Ljava/lang/Object;
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.java
new file mode 100644
index 0000000..47a28c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_array.d;
+
+public class T_new_array_3 {
+
+    public Object[] run(int sz) {
+        return new Object[sz];
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_4.d
new file mode 100644
index 0000000..2f75ff1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_4.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[I
+.limit regs 5
+
+       new-array v5, v4, [I
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_5.d
new file mode 100644
index 0000000..9ce7d3e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_5.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[I
+.limit regs 5
+
+       const-wide v3, 1
+       new-array v0, v3, [I
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.d
new file mode 100644
index 0000000..885beba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_6.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[I
+.limit regs 5
+
+       new-array v0, v4, [I
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh
new file mode 100644
index 0000000..0794b49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh
@@ -0,0 +1,270 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/new_array/d/T_new_array_6.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/new_array/d/T_new_array_6.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 0877446e
+    6E 44 77 08 
+// parsed: offset 12, len 20: signature           : 7016...e092
+    70 16 D1 71 A3 86 82 A2 90 FA CB 70 1E 3F F9 18 2B 71 E0 92 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 9
+    09 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 5
+    05 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 302 (0x00012e) "<init>"
+    2E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 310 (0x000136) "I"
+    36 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 313 (0x000139) "LI"
+    39 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 317 (0x00013d) "Ldot/junit/opcodes/new_array/d/T_new_array_6;"
+    3D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 364 (0x00016c) "Ljava/lang/Object;"
+    6C 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 384 (0x000180) "T_new_array_6.java"
+    80 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 404 (0x000194) "V"
+    94 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 407 (0x000197) "[I"
+    97 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 411 (0x00019b) "run"
+    9B 01 00 00 
+
+// type_ids:
+// parsed: offset 148, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 152, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/new_array/d/T_new_array_6;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 160, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+// parsed: offset 164, len 4: [4] descriptor_idx: 7 (0x000007) "[I"
+    07 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 2 (0x000002) "LI"
+//     return_type_idx: 4 (0x000004) "[I"
+//     parameters_off: 296 (0x000128)
+    02 00 00 00 04 00 00 00 28 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 8 (0x000008) "run"
+    01 00 01 00 08 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/new_array/d/T_new_array_6;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_new_array_6.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 416 (0x0001a0)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 A0 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.new_array.d.T_new_array_6.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.new_array.d.T_new_array_6.run"
+    // parsed: offset 272, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 274, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: new-array v0, v4, [I // class@0004
+//@mod            23 40 04 00 
+            23 40 04 01 
+        // parsed: offset 292, len 2: |0002: return-object v0
+            11 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// TYPE_LIST
+    // parsed: offset 296, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 300, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 302, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 310, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 313, len 4: TYPE_STRING_DATA_ITEM [2] "LI"
+    02 4C 49 00 
+// parsed: offset 317, len 47: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/new_array/d/T_new_array_6;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 6E 65 77 5F 61 72 72 61 79 2F 64 2F 54 5F 6E 65 77 5F 61 72 72 61 79 5F 36 3B 00 
+// parsed: offset 364, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 384, len 20: TYPE_STRING_DATA_ITEM [5] "T_new_array_6.java"
+    12 54 5F 6E 65 77 5F 61 72 72 61 79 5F 36 2E 6A 61 76 61 00 
+// parsed: offset 404, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 407, len 4: TYPE_STRING_DATA_ITEM [7] "[I"
+    02 5B 49 00 
+// parsed: offset 411, len 5: TYPE_STRING_DATA_ITEM [8] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/new_array/d/T_new_array_6;"
+    // parsed: offset 416, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 417, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 418, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 419, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 421, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 424, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 426, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 427, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 428, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 430, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 112 (0x000070)
+        01 00 00 00 09 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 5
+    //      offset: 148 (0x000094)
+        02 00 00 00 05 00 00 00 94 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 02 00 00 00 A8 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 296 (0x000128)
+        01 10 00 00 01 00 00 00 28 01 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 9
+    //      offset: 302 (0x00012e)
+        02 20 00 00 09 00 00 00 2E 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 416 (0x0001a0)
+        00 20 00 00 01 00 00 00 A0 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_7.d
new file mode 100644
index 0000000..f6f2588
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_7.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[Ljava/lang/Object;
+.limit regs 5
+
+       new-array v0, v4, java/lang/Object
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_8.d
new file mode 100644
index 0000000..a221fc2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_8.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[Ljava/lang/Object;
+.limit regs 5
+
+       new-array v0, v4, [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Ljava/lang/Object;
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_9.d
new file mode 100644
index 0000000..914322a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_array/d/T_new_array_9.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_array_9.java
+.class public dot.junit.opcodes.new_array.d.T_new_array_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)[I
+.limit regs 5
+
+       new-array v0, v3, [I
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TTestClass.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TTestClass.java
new file mode 100644
index 0000000..679e665
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TTestClass.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance;
+
+public class TTestClass {
+
+    @SuppressWarnings("unused")
+    private class TestStub {
+        // used by testE3
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TestStubs.java
new file mode 100644
index 0000000..ca22946
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/TestStubs.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance;
+
+// package access to trigger IllegalAccessError in testVFE5
+class TestStubs {
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/Test_new_instance.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/Test_new_instance.java
new file mode 100644
index 0000000..d994f65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/Test_new_instance.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.new_instance.d.T_new_instance_1;
+import dot.junit.opcodes.new_instance.d.T_new_instance_3;
+import dot.junit.opcodes.new_instance.d.T_new_instance_4;
+import dot.junit.opcodes.new_instance.d.T_new_instance_5;
+import dot.junit.opcodes.new_instance.d.T_new_instance_8;
+import dot.junit.opcodes.new_instance.d.T_new_instance_9;
+
+
+public class Test_new_instance extends DxTestCase {
+
+    /**
+     * @title new String
+     */
+    public void testN1() {
+        T_new_instance_1 t = new T_new_instance_1();
+        String s = t.run();
+        assertNotNull(s);
+        assertEquals(0, s.compareTo("abc"));
+    }
+
+    /**
+     * @title class initialization throws exception
+     */
+    public void testE1() {
+        try {
+            T_new_instance_3.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A21
+     * @title  attempt to instantiate interface
+     */
+    public void testE4() {
+        //@uses dot.junit.opcodes.new_instance.d.TestAbstractClass
+        //@uses dot.junit.opcodes.new_instance.d.T_new_instance_8
+        T_new_instance_8 t = new T_new_instance_8();
+        try {
+            t.run();
+            fail("expected InstantiationError");
+        } catch (InstantiationError ie) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A21
+     * @title  attempt to instantiate abstract
+     * class
+     */
+    public void testE5() {
+        //@uses dot.junit.opcodes.new_instance.d.TestAbstractClass
+        //@uses dot.junit.opcodes.new_instance.d.T_new_instance_9
+        T_new_instance_9 t = new T_new_instance_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error iae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A18
+     * @title  constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A21
+     * @title  attempt to create array using new
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B6
+     * @title Attempt to access uninitialized class (before <init> is
+     * called
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to instantiate array of inaccessible class.
+     */
+    public void testVFE5() {
+        //@uses dot.junit.opcodes.new_instance.TestStubs
+        //@uses dot.junit.opcodes.new_instance.d.T_new_instance_4
+        try {
+            new T_new_instance_4().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to instantiate array of non-existent class.
+     */
+    public void testVFE6() {
+        try {
+            new T_new_instance_5().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint B7
+     * @title A register which holds the result of a new-instance instruction must not be used
+     * if the same new-instance  instruction is again executed before the instance is initialized
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B7
+     * @title A register which holds the result of a new-instance instruction must not be used
+     * if the same new-instance  instruction is again executed before the instance is initialized
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.new_instance.d.T_new_instance_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d
new file mode 100644
index 0000000..0cff87a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_1.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 6
+
+       new-instance v1, java/lang/String
+       const-string v3, "abc"
+       invoke-direct {v1, v3}, java/lang/String/<init>(Ljava/lang/String;)V
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java
new file mode 100644
index 0000000..c8f4878
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_1 {
+
+    public String run() {
+        return new String("abc");
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d
new file mode 100644
index 0000000..cd9096d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_10.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       new-instance v6, java/lang/String
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
new file mode 100644
index 0000000..75fb804
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_11.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const v4, 5
+       move-object v1, v5
+Label0:
+       move-object v0, v1
+       new-instance v1, java/lang/Integer
+       
+       add-int/lit8 v4, v4, -1
+       if-nez v4, Label0
+
+       invoke-direct {v1, v4}, java/lang/Integer/<init>(I)V
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d
new file mode 100644
index 0000000..e4b025e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_12.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+    const v0, 0
+Label1:
+    new-instance v1,        java/lang/Integer
+    if-nez v0, INIT
+    move-object v2, v1
+    const v0, 1
+    goto Label1
+INIT:
+        
+    invoke-direct {v1, v0}, java/lang/Integer/<init>(I)V
+    invoke-virtual {v2}, java/lang/Integer/toString()Ljava/lang/String;
+
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d
new file mode 100644
index 0000000..2a8eefb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_2.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_2
+.super java/lang/Object
+
+.field  i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static run()I
+.limit regs 5
+
+    new-instance v0, dot/junit/opcodes/new_instance/d/T_new_instance_2
+;    invoke-direct {v0}, dot/junit/opcodes/new_instance/d/T_new_instance_2/<init>()V
+
+    iget v1, v0, dot.junit.opcodes.new_instance.d.T_new_instance_2.i I
+
+    return v1
+
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d
new file mode 100644
index 0000000..f6cd6fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_3.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_3
+.super java/lang/Object
+
+.field static i I
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/16 v0, 123
+       const/4 v1, 0
+       div-int/lit8 v0, v0, 0
+       sput v0, dot.junit.opcodes.new_instance.d.T_new_instance_3.i I
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+Label5:
+       return-void
+.end method
+
+.method public static run()I
+.limit regs 4
+
+       new-instance v1, dot/junit/opcodes/new_instance/d/T_new_instance_3
+       invoke-direct {v1}, dot/junit/opcodes/new_instance/d/T_new_instance_3/<init>()V
+
+       sget v1, dot.junit.opcodes.new_instance.d.T_new_instance_3.i I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java
new file mode 100644
index 0000000..dd8bb15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_3 {
+
+    static int i = 123 / 0;
+
+    public static int run() {
+        T_new_instance_3 t = new T_new_instance_3();
+        return t.i;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d
new file mode 100644
index 0000000..a92c597
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_4.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/new_instance/TestStubs
+;       invoke-direct {v1}, dot/junit/opcodes/new_instance/TestStubs/<init>()V
+; intentionally return v4 ("this")    
+       return-object v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java
new file mode 100644
index 0000000..9ed269f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_4 {
+
+     public Object run() {
+            return null;
+        }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d
new file mode 100644
index 0000000..4651f6a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_5.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/new_instance/Test_new_instanceNNNNN
+;       invoke-direct {v1}, dot/junit/opcodes/new_instance/TTestClass/<init>()V
+; intentionally return v4 ("this")    
+       return-object v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java
new file mode 100644
index 0000000..7c6b0c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_5 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d
new file mode 100644
index 0000000..0565aea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_6.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 6
+
+       new-instance v1, java/lang/String
+       const-string v3, "abc"
+       invoke-direct {v1, v3}, java/lang/String/<init>(Ljava/lang/String;)V
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh
new file mode 100644
index 0000000..91ac7e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh
@@ -0,0 +1,279 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/new_instance/d/T_new_instance_6.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/new_instance/d/T_new_instance_6.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a36952db
+    DB 52 69 A3 
+// parsed: offset 12, len 20: signature           : 71b1...5136
+    71 B1 EB E5 E0 7E D8 D6 08 9A F1 CD 12 14 9C 8E 6E 4F 51 36 
+// parsed: offset 32, len 4: file_size           : 624
+    70 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 488 (0x0001e8)
+    E8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 10
+    0A 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 3
+    03 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 168 (0x0000a8)
+    A8 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 4
+    04 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 236 (0x0000ec)
+    EC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 356
+    64 01 00 00 
+// parsed: offset 108, len 4: data_off            : 268 (0x00010c)
+    0C 01 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 330 (0x00014a) "<init>"
+    4A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 338 (0x000152) "L"
+    52 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 341 (0x000155) "Ldot/junit/opcodes/new_instance/d/T_new_instance_6;"
+    55 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 394 (0x00018a) "Ljava/lang/Object;"
+    8A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 414 (0x00019e) "Ljava/lang/String;"
+    9E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 434 (0x0001b2) "T_new_instance_6.java"
+    B2 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 457 (0x0001c9) "V"
+    C9 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 460 (0x0001cc) "VL"
+    CC 01 00 00 
+// parsed: offset 144, len 4: [8] string_data_off: 464 (0x0001d0) "abc"
+    D0 01 00 00 
+// parsed: offset 148, len 4: [9] string_data_off: 469 (0x0001d5) "run"
+    D5 01 00 00 
+
+// type_ids:
+// parsed: offset 152, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/new_instance/d/T_new_instance_6;"
+    02 00 00 00 
+// parsed: offset 156, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 160, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/String;"
+    04 00 00 00 
+// parsed: offset 164, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 168, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 2 (0x000002) "Ljava/lang/String;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 180, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+// parsed: offset 192, len 12: [2] 
+//     shorty_idx: 7 (0x000007) "VL"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 324 (0x000144)
+    07 00 00 00 03 00 00 00 44 01 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 204, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 212, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 9 (0x000009) "run"
+    00 00 00 00 09 00 00 00 
+// parsed: offset 220, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 228, len 8: [3] class_idx: 2 (0x000002)  proto_idx: 2 (0x000002) name_idx: 0 (0x000000) "<init>"
+    02 00 02 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 236, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/new_instance/d/T_new_instance_6;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_new_instance_6.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 474 (0x0001da)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 DA 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.new_instance.d.T_new_instance_6.<init>"
+    // parsed: offset 268, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 284, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 290, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.new_instance.d.T_new_instance_6.run"
+    // parsed: offset 292, len 2: registers_size: 6
+        06 00 
+    // parsed: offset 294, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 296, len 2: outs_size: 2
+        02 00 
+    // parsed: offset 298, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 300, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 304, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 308, len 4: |0000: new-instance v1, Ljava/lang/String; // class@0002
+//@mod            22 01 02 00 
+            22 01 02 01 
+        // parsed: offset 312, len 4: |0002: const-string v3, "abc" // string@0008
+            1A 03 08 00 
+        // parsed: offset 316, len 6: |0004: invoke-direct {v1, v3}, Ljava/lang/String;.<init>:(Ljava/lang/String;)V // method@0003
+            70 20 03 00 31 00 
+        // parsed: offset 322, len 2: |0007: return-object v1
+            11 01 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 324, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 328, len 2: type_item [0] type_idx: 2
+        02 00 
+// parsed: offset 330, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 338, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 341, len 53: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/new_instance/d/T_new_instance_6;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 6E 65 77 5F 69 6E 73 74 61 6E 63 65 2F 64 2F 54 5F 6E 65 77 5F 69 6E 73 74 61 6E 63 65 5F 36 3B 00 
+// parsed: offset 394, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 414, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/String;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 00 
+// parsed: offset 434, len 23: TYPE_STRING_DATA_ITEM [5] "T_new_instance_6.java"
+    15 54 5F 6E 65 77 5F 69 6E 73 74 61 6E 63 65 5F 36 2E 6A 61 76 61 00 
+// parsed: offset 457, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 460, len 4: TYPE_STRING_DATA_ITEM [7] "VL"
+    02 56 4C 00 
+// parsed: offset 464, len 5: TYPE_STRING_DATA_ITEM [8] "abc"
+    03 61 62 63 00 
+// parsed: offset 469, len 5: TYPE_STRING_DATA_ITEM [9] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/new_instance/d/T_new_instance_6;"
+    // parsed: offset 474, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 475, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 476, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 477, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 479, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 482, len 2: code_off: 268 (0x00010c)
+                8C 02 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 484, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 485, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 486, len 2: code_off: 292 (0x000124)
+                A4 02 
+// map_list:
+    // parsed: offset 488, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 492, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 504, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 112 (0x000070)
+        01 00 00 00 0A 00 00 00 70 00 00 00 
+    // parsed: offset 516, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 152 (0x000098)
+        02 00 00 00 04 00 00 00 98 00 00 00 
+    // parsed: offset 528, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 168 (0x0000a8)
+        03 00 00 00 03 00 00 00 A8 00 00 00 
+    // parsed: offset 540, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 204 (0x0000cc)
+        05 00 00 00 04 00 00 00 CC 00 00 00 
+    // parsed: offset 552, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 236 (0x0000ec)
+        06 00 00 00 01 00 00 00 EC 00 00 00 
+    // parsed: offset 564, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 268 (0x00010c)
+        01 20 00 00 02 00 00 00 0C 01 00 00 
+    // parsed: offset 576, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 324 (0x000144)
+        01 10 00 00 01 00 00 00 44 01 00 00 
+    // parsed: offset 588, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 10
+    //      offset: 330 (0x00014a)
+        02 20 00 00 0A 00 00 00 4A 01 00 00 
+    // parsed: offset 600, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 474 (0x0001da)
+        00 20 00 00 01 00 00 00 DA 01 00 00 
+    // parsed: offset 612, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 488 (0x0001e8)
+        00 10 00 00 01 00 00 00 E8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d
new file mode 100644
index 0000000..f2e7fcf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_7.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       new-instance v1, [Ljava/lang/Object;
+; intentionally return v2 ("this")           
+       return-object v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java
new file mode 100644
index 0000000..f93c886
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_7 {
+
+    public Object run() {
+        return new Object();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d
new file mode 100644
index 0000000..f474fe9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_8.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/new_instance/d/TestInterface
+;       invoke-direct {v1}, dot/junit/opcodes/new_instance/d/TestInterface/<init>()V
+; intentionally return v4 ("this")    
+       return-object v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java
new file mode 100644
index 0000000..1ca9c38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_8 {
+
+    public Object run() {
+        return new Object();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d
new file mode 100644
index 0000000..7af9f46
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_new_instance_9.java
+.class public dot.junit.opcodes.new_instance.d.T_new_instance_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+Label5:
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/new_instance/d/TestAbstractClass
+;       invoke-direct {v1}, dot/junit/opcodes/new_instance/d/TestAbstractClass/<init>()V
+; intentionally return v4 ("this")    
+       return-object v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java
new file mode 100644
index 0000000..9f1d2bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+public class T_new_instance_9 {
+
+    public Object run() {
+        return new Object();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d
new file mode 100644
index 0000000..ea321c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d
@@ -0,0 +1,22 @@
+; Copyright (C) 2008 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.
+
+.source TestAbstractClass.java
+.interface public dot.junit.opcodes.new_instance.d.TestInterface
+
+
+.source TestAbstractClass.java
+.class abstract public dot.junit.opcodes.new_instance.d.TestAbstractClass
+.super java/lang/Object
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestStubs.java
new file mode 100644
index 0000000..cb28c6a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/TestStubs.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.new_instance.d;
+
+
+interface TestInterface {
+    public abstract void test();
+}
+
+abstract class TestAbstractClass{
+    
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/nop/Test_nop.java b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/Test_nop.java
new file mode 100644
index 0000000..9044e8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/Test_nop.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.nop;
+
+import dot.junit.DxTestCase;
+import dot.junit.opcodes.nop.d.T_nop_1;
+
+public class Test_nop extends DxTestCase {
+    /**
+     * @title tests nop
+     */
+    public void testN1() {
+        T_nop_1 t = new T_nop_1();
+        // how do we test nop - e.g. initialize some registers and
+        // test if nothing has changed
+        assertTrue(t.run());
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.d
new file mode 100644
index 0000000..59a85e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_nop_1.java
+.class public dot.junit.opcodes.nop.d.T_nop_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 3
+       move-object v1, v2
+       invoke-direct {v1}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 4
+       const v1, 12345678
+       nop
+       nop
+       nop
+       nop
+       nop
+       move v3, v1
+       nop
+       nop
+       nop
+       if-ne v1, v3, Label1
+       const/4 v1, 1
+       return v1
+Label1:
+       const/4 v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.java
new file mode 100644
index 0000000..ec16b22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/nop/d/T_nop_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.nop.d;
+
+public class T_nop_1 {
+
+    public boolean run() {
+      return true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/Test_not_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/Test_not_int.java
new file mode 100644
index 0000000..0960e32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/Test_not_int.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.not_int.d.T_not_int_1;
+import dot.junit.opcodes.not_int.d.T_not_int_2;
+
+public class Test_not_int extends DxTestCase {
+    
+    /**
+     * @title Argument = 5; 256
+     */
+    public void testN1() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(-6, t.run(5));
+        assertEquals(-257, t.run(256));
+    }
+    
+    /**
+     * @title Argument = -5, -256
+     */
+    public void testN2() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(4, t.run(-5));
+        assertEquals(255, t.run(-256));
+    }
+    
+    /**
+     * @title Argument = 0xcafe; 0x12c
+     */
+    public void testN3() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(-0xcaff, t.run(0xcafe));
+        assertEquals(-0x12d, t.run(0x12c));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this multiplication of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_not_int_2 t = new T_not_int_2();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Argument = 1
+     */
+    public void testB3() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(-2, t.run(1));
+    }
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB4() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(-1, t.run(0));
+    }
+    
+    /**
+     * @title Argument = -1
+     */
+    public void testB5() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(0, t.run(-1));
+    }
+    
+    /**
+     * @title Argument = Short.MAX_VALUE
+     */
+    public void testB6() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(Short.MIN_VALUE, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title Argument = Short.MIN_VALUE
+     */
+    public void testB7() {
+        T_not_int_1 t = new T_not_int_1();
+        assertEquals(Short.MAX_VALUE, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.not_int.d.T_not_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.not_int.d.T_not_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.not_int.d.T_not_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.not_int.d.T_not_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.d
new file mode 100644
index 0000000..2b04225
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_1.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       not-int v0, v4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.java
new file mode 100644
index 0000000..b8ac929
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_int.d;
+
+public class T_not_int_1 {
+    
+    public int run(int d) {
+        return ~d;
+    }    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.d
new file mode 100644
index 0000000..3e1ff4a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_2.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+       not-int v0, v4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.java
new file mode 100644
index 0000000..679acb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_int.d;
+
+public class T_not_int_2 {
+    
+    public int run(float d) {
+        return ~(int)d;
+    }    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_3.d
new file mode 100644
index 0000000..a42823e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_3.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       not-int v0, v5
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_4.d
new file mode 100644
index 0000000..1182ead
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_4.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 5
+
+       not-int v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_5.d
new file mode 100644
index 0000000..a144392
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_5.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 5
+
+       not-int v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_6.d
new file mode 100644
index 0000000..c22438f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_int/d/T_not_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_int_6.java
+.class public dot.junit.opcodes.not_int.d.T_not_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       not-int v0, v3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/Test_not_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/Test_not_long.java
new file mode 100644
index 0000000..a40cdd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/Test_not_long.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.not_long.d.T_not_long_1;
+import dot.junit.opcodes.not_long.d.T_not_long_2;
+
+public class Test_not_long extends DxTestCase {
+    
+    /**
+     * @title Argument = 500000l
+     */
+    public void testN1() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(-500001l, t.run(500000l));
+    }
+    
+    /**
+     * @title Argument = -500000l
+     */
+    public void testN2() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(499999l, t.run(-500000l));
+    }
+    
+    /**
+     * @title Argument = 0xcafe; 0x12c
+     */
+    public void testN3() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(-0xcaff, t.run(0xcafe));
+        assertEquals(-0x12d, t.run(0x12c));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this multiplication of long and double makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_not_long_2 t = new T_not_long_2();
+        try {
+            t.run(1.79d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Argument = Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(Long.MIN_VALUE, t.run(Long.MAX_VALUE));
+    }
+    
+    /**
+     * @title Argument = Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(Long.MAX_VALUE, t.run(Long.MIN_VALUE));
+    }
+    
+    /**
+     * @title Argument = 1l
+     */
+    public void testB3() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(-2l, t.run(1l));
+    }
+    
+    /**
+     * @title Argument = 0l
+     */
+    public void testB4() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(-1l, t.run(0l));
+    }
+    
+    /** 
+     * @title Argument = -1l
+     */
+    public void testB5() {
+        T_not_long_1 t = new T_not_long_1();
+        assertEquals(0l, t.run(-1l));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.not_long.d.T_not_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.not_long.d.T_not_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.not_long.d.T_not_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.not_long.d.T_not_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.d
new file mode 100644
index 0000000..9d27053
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_1.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 8
+
+       not-long v0, v6
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.java
new file mode 100644
index 0000000..535d69d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_long.d;
+
+public class T_not_long_1 {
+    
+    public long run(long d) {
+        return ~d;
+    } 
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.d
new file mode 100644
index 0000000..cd253a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_2.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)J
+.limit regs 5
+
+       not-long v0, v3
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.java
new file mode 100644
index 0000000..9f93955
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.not_long.d;
+
+public class T_not_long_2 {
+    
+    public long run(double d) {
+        return ~(long)d;
+    } 
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_3.d
new file mode 100644
index 0000000..b9eda02
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_3.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 5
+
+       not-long v0, v5
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_4.d
new file mode 100644
index 0000000..3ecd0f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_4.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)J
+.limit regs 5
+
+       not-long v0, v4
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_5.d
new file mode 100644
index 0000000..31c1dfc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_5.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)J
+.limit regs 5
+
+       not-long v0, v4
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_6.d
new file mode 100644
index 0000000..4d511df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/not_long/d/T_not_long_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_not_long_6.java
+.class public dot.junit.opcodes.not_long.d.T_not_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)J
+.limit regs 5
+
+       not-long v0, v2
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/Test_opc_const.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/Test_opc_const.java
new file mode 100644
index 0000000..aa19e6c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/Test_opc_const.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_const;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.opc_const.d.T_opc_const_1;
+import dot.junit.opcodes.opc_const.d.T_opc_const_2;
+
+public class Test_opc_const extends DxTestCase {
+    /**
+     * @title const v1, 1.54
+     */
+    public void testN1() {
+        T_opc_const_1 t = new T_opc_const_1();
+        float a = 1.5f;
+        float b = 0.04f;
+        assertEquals(a + b, t.run(), 0f);
+        assertEquals(1.54f, t.run(), 0f);
+    }
+    
+    /**
+     * @title const v254, 20000000 
+     */
+    public void testN2() {
+        T_opc_const_2 t = new T_opc_const_2();
+         int a = 10000000;
+         int b = 10000000;
+        assertEquals(a + b, t.run());
+    }
+
+    /**
+     * @constraint B1 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_const.d.T_opc_const_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title When writing to a register that is one half of a register 
+     * pair, but not touching the other half, the old register pair gets broken up, and the 
+     * other register involved in it becomes undefined
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_const.d.T_opc_const_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d
new file mode 100644
index 0000000..8246f1b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_const_1.java
+.class public dot.junit.opcodes.opc_const.d.T_opc_const_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()F
+.limit regs 3
+
+       const v1, 1.54
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java
new file mode 100644
index 0000000..1bf4f0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_const.d;
+
+public class T_opc_const_1 {
+    
+    public float run(){
+        return 1.54f;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d
new file mode 100644
index 0000000..d651fe9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_const_2.java
+.class public dot.junit.opcodes.opc_const.d.T_opc_const_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 255
+
+       const v254, 20000000
+       return v254
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java
new file mode 100644
index 0000000..07cd52a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_const.d;
+
+public class T_opc_const_2 {
+
+    public int run() {
+        return 20000000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d
new file mode 100644
index 0000000..d0065db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_const_3.java
+.class public dot.junit.opcodes.opc_const.d.T_opc_const_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v3, 1234
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d
new file mode 100644
index 0000000..f2d5697
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_const_4.java
+.class public dot.junit.opcodes.opc_const.d.T_opc_const_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+       const-wide v0, 1234    
+       const v1, 1234
+
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java
new file mode 100644
index 0000000..a3558fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_goto;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.opc_goto.d.T_opc_goto_1;
+
+public class Test_opc_goto extends DxTestCase {
+   /**
+    * @title forward and backward goto. This test also tests constraint C17 allowing to have
+     * backward goto as a last opcode in the method.
+    */
+   public void testN1() {
+       T_opc_goto_1 t = new T_opc_goto_1();
+       assertEquals(0, t.run(20));
+   }
+
+   /**
+    * @constraint A6 
+    * @title branch target is inside instruction
+    */
+   public void testVFE1() {
+       try {
+           Class.forName("dot.junit.opcodes.opc_goto.d.T_opc_goto_2");
+           fail("expected a verification exception");
+       } catch (Throwable t) {
+           DxUtil.checkVerifyException(t);
+       }
+   }
+
+   /**
+    * @constraint A6 
+    * @title branch target shall be inside the method
+    */
+   public void testVFE2() {
+       try {
+           Class.forName("dot.junit.opcodes.opc_goto.d.T_opc_goto_3");
+           fail("expected a verification exception");
+       } catch (Throwable t) {
+           DxUtil.checkVerifyException(t);
+       }
+   }
+
+   /**
+    * @constraint n/a 
+    * @title zero offset
+    */
+   public void testVFE3() {
+       try {
+           Class.forName("dot.junit.opcodes.opc_goto.d.T_opc_goto_4");
+           fail("expected a verification exception");
+       } catch (Throwable t) {
+           DxUtil.checkVerifyException(t);
+       }
+   }
+   
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d
new file mode 100644
index 0000000..e9b75ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_goto_1.java
+.class public dot.junit.opcodes.opc_goto.d.T_opc_goto_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+; test positive offset
+      goto Label2
+LabelReturn:      
+      return v4
+      
+Label2:
+       add-int/lit8 v4, v4, -1
+       if-lez v4, LabelExit
+; test negative offset       
+       goto Label2
+       
+LabelExit:       
+       goto LabelReturn
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java
new file mode 100644
index 0000000..30c4e74
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_goto.d;
+
+public class T_opc_goto_1 {
+
+    public int run(int a) {
+        while (a > 0) {
+            a--;
+        }
+        return a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d
new file mode 100644
index 0000000..8cb3602
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_goto_2.java
+.class public dot.junit.opcodes.opc_goto.d.T_opc_goto_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh
new file mode 100644
index 0000000..3917c98
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : cf734093
+    93 40 73 CF 
+// parsed: offset 12, len 20: signature           : 19a1...8fae
+    19 A1 80 04 F4 E4 1C 91 9B AB 4F FF A1 01 C6 17 E3 C0 8F AE 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 290 (0x000122) "<init>"
+    22 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 298 (0x00012a) "I"
+    2A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 301 (0x00012d) "II"
+    2D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 305 (0x000131) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_2;"
+    31 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 370 (0x000172) "T_opc_goto_2.java"
+    72 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "V"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 392 (0x000188) "run"
+    88 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_2;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 284 (0x00011c)
+    02 00 00 00 00 00 00 00 1C 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_2;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_opc_goto_2.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 397 (0x00018d)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8D 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_2.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_2.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 2
+        02 00 00 00 
+    // insns:
+        // parsed: offset 280, len 2: |0000: goto 0001 // +0x0001
+//@mod            28 01 
+            28 02 
+        // parsed: offset 282, len 2: |0001: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 284, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 288, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 290, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 298, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 301, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 305, len 45: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_2;"
+    2B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 6F 70 63 5F 67 6F 74 6F 2F 64 2F 54 5F 6F 70 63 5F 67 6F 74 6F 5F 32 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 19: TYPE_STRING_DATA_ITEM [5] "T_opc_goto_2.java"
+    11 54 5F 6F 70 63 5F 67 6F 74 6F 5F 32 2E 6A 61 76 61 00 
+// parsed: offset 389, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 392, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_2;"
+    // parsed: offset 397, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 398, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 400, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 401, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 402, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 405, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 408, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 409, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 411, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 284 (0x00011c)
+        01 10 00 00 01 00 00 00 1C 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 290 (0x000122)
+        02 20 00 00 08 00 00 00 22 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 397 (0x00018d)
+        00 20 00 00 01 00 00 00 8D 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d
new file mode 100644
index 0000000..8edcca6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_goto_3.java
+.class public dot.junit.opcodes.opc_goto.d.T_opc_goto_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto Label2
+Label2:
+       return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh
new file mode 100644
index 0000000..9da5505
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 4d883f57
+    57 3F 88 4D 
+// parsed: offset 12, len 20: signature           : 16da...c0ad
+    16 DA B2 AB 5C D5 C9 74 71 01 63 17 93 81 6E 18 34 96 C0 AD 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 290 (0x000122) "<init>"
+    22 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 298 (0x00012a) "I"
+    2A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 301 (0x00012d) "II"
+    2D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 305 (0x000131) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_3;"
+    31 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 370 (0x000172) "T_opc_goto_3.java"
+    72 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "V"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 392 (0x000188) "run"
+    88 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_3;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 284 (0x00011c)
+    02 00 00 00 00 00 00 00 1C 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_opc_goto_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 397 (0x00018d)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8D 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_3.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_3.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 2
+        02 00 00 00 
+    // insns:
+        // parsed: offset 280, len 2: |0000: goto 0001 // +0x0001
+//@mod            28 01 
+            28 10 
+        // parsed: offset 282, len 2: |0001: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 284, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 288, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 290, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 298, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 301, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 305, len 45: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_3;"
+    2B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 6F 70 63 5F 67 6F 74 6F 2F 64 2F 54 5F 6F 70 63 5F 67 6F 74 6F 5F 33 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 19: TYPE_STRING_DATA_ITEM [5] "T_opc_goto_3.java"
+    11 54 5F 6F 70 63 5F 67 6F 74 6F 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 389, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 392, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_3;"
+    // parsed: offset 397, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 398, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 400, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 401, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 402, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 405, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 408, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 409, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 411, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 284 (0x00011c)
+        01 10 00 00 01 00 00 00 1C 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 290 (0x000122)
+        02 20 00 00 08 00 00 00 22 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 397 (0x00018d)
+        00 20 00 00 01 00 00 00 8D 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d
new file mode 100644
index 0000000..6c29f65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_goto_4.java
+.class public dot.junit.opcodes.opc_goto.d.T_opc_goto_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+      goto Label1
+Label1:      
+      return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh
new file mode 100644
index 0000000..5666601
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 97783f02
+    02 3F 78 97 
+// parsed: offset 12, len 20: signature           : a610...059a
+    A6 10 17 6F A6 2E 7A AE A2 D0 27 EA 5E C8 BF 3E 13 91 05 9A 
+// parsed: offset 32, len 4: file_size           : 548
+    24 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 412 (0x00019c)
+    9C 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 308
+    34 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 290 (0x000122) "<init>"
+    22 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 298 (0x00012a) "I"
+    2A 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 301 (0x00012d) "II"
+    2D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 305 (0x000131) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_4;"
+    31 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 370 (0x000172) "T_opc_goto_4.java"
+    72 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "V"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 392 (0x000188) "run"
+    88 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_4;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 284 (0x00011c)
+    02 00 00 00 00 00 00 00 1C 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_opc_goto_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 397 (0x00018d)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 8D 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_4.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.opc_goto.d.T_opc_goto_4.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 2
+        02 00 00 00 
+    // insns:
+        // parsed: offset 280, len 2: |0000: goto 0001 // +0x0001
+//@mod            28 01 
+            28 00 
+        // parsed: offset 282, len 2: |0001: return v4
+            0F 04 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 284, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 288, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 290, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 298, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 301, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 305, len 45: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_4;"
+    2B 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 6F 70 63 5F 67 6F 74 6F 2F 64 2F 54 5F 6F 70 63 5F 67 6F 74 6F 5F 34 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 19: TYPE_STRING_DATA_ITEM [5] "T_opc_goto_4.java"
+    11 54 5F 6F 70 63 5F 67 6F 74 6F 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 389, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 392, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/opc_goto/d/T_opc_goto_4;"
+    // parsed: offset 397, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 398, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 399, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 400, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 401, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 402, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 405, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 408, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 409, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 411, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 412, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 416, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 428, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 440, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 452, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 464, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 476, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 488, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 500, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 284 (0x00011c)
+        01 10 00 00 01 00 00 00 1C 01 00 00 
+    // parsed: offset 512, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 290 (0x000122)
+        02 20 00 00 08 00 00 00 22 01 00 00 
+    // parsed: offset 524, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 397 (0x00018d)
+        00 20 00 00 01 00 00 00 8D 01 00 00 
+    // parsed: offset 536, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 412 (0x00019c)
+        00 10 00 00 01 00 00 00 9C 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/Test_opc_return.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/Test_opc_return.java
new file mode 100644
index 0000000..2fe8323
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/Test_opc_return.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_return;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.opc_return.d.T_opc_return_1;
+import dot.junit.opcodes.opc_return.d.T_opc_return_3;
+
+public class Test_opc_return extends DxTestCase {
+    /**
+     * @title check that frames are discarded and reinstananted correctly
+     */
+    public void testN1() {
+        T_opc_return_1 t = new T_opc_return_1();
+        assertEquals(123456, t.run());
+    }
+
+
+    /**
+     * @title Method is synchronized but thread is not monitor owner
+     */
+    public void testE1() {
+        T_opc_return_3 t = new T_opc_return_3();
+        try {
+            assertTrue(t.run());
+            fail("expected IllegalMonitorStateException");
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B11 
+     * @title method's return type - long
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_return.d.T_opc_return_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title method's return type - reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_return.d.T_opc_return_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_return.d.T_opc_return_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title return on wide register pair
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.opc_return.d.T_opc_return_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d
new file mode 100644
index 0000000..29ae5bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d
@@ -0,0 +1,70 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_1.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 10
+    
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    
+    const v4, 0xdddd
+        
+    invoke-static {}, dot/junit/opcodes/opc_return/d/T_opc_return_1/test()I
+    move-result v6
+    
+    if-ne v4, v6, Label0
+
+    const v4, 1    
+    if-ne v1, v4, Label0
+    
+    const v4, 2    
+    if-ne v2, v4, Label0
+
+    const v4, 3
+    if-ne v3, v4, Label0
+    
+    const v0, 123456
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+.method private static test()I
+.limit regs 6
+    
+    const v0, 9999
+    const v1, 0xaaa
+    const v2, 0xbbbb
+    const v3, 0xcccc
+    
+    const v4, 0xdddd
+    return v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java
new file mode 100644
index 0000000..2f5029d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_return.d;
+
+public class T_opc_return_1 {
+
+    public int run() {
+        test();
+        return 123456;
+    }
+    
+    private static int test() {
+        int a = 0xaaaa;
+        int b = 0xbbbb;
+        int c = 0xcccc;
+        return 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
new file mode 100644
index 0000000..2410da3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_3.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private declared_synchronized test()F
+.limit regs 4
+
+    monitor-exit v3
+    const v0, 1.0
+    return v0
+.end method
+
+
+
+.method public run()Z
+.limit regs 1
+
+    invoke-direct {v0}, dot/junit/opcodes/opc_return/d/T_opc_return_3/test()F
+
+    const v0, 1
+    return v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java
new file mode 100644
index 0000000..6b93391
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_return.d;
+
+public class T_opc_return_3 {
+    
+    private synchronized long test() {
+        return 1;
+    }
+    
+    public boolean run() {
+        test();
+        return true;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d
new file mode 100644
index 0000000..884ce2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_5.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 6
+    
+    const v0, 1
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d
new file mode 100644
index 0000000..c19f760
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_6.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 6
+    
+    const v0, 1
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d
new file mode 100644
index 0000000..cec1f9c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_7.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+    
+    return v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d
new file mode 100644
index 0000000..1ca6832
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_return_8.java
+.class public dot.junit.opcodes.opc_return.d.T_opc_return_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+    
+    const-wide v0, 0
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java
new file mode 100644
index 0000000..5055336
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_1;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_12;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_2;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_4;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_5;
+import dot.junit.opcodes.opc_throw.d.T_opc_throw_8;
+
+public class Test_opc_throw extends DxTestCase {
+    /**
+     * @title check throw functionality. This test also tests constraint C17 allowing to have
+     * throw as a last opcode in the method.
+     */
+    public void testN1() {
+        T_opc_throw_1 t = new T_opc_throw_1();
+        try {
+            t.run();
+            fail("must throw a RuntimeException");
+        } catch (RuntimeException re) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Throwing of the objectref on the class Throwable
+     */
+    public void testN2() {
+        T_opc_throw_2 t = new T_opc_throw_2();
+        try {
+            t.run();
+            fail("must throw a Throwable");
+        } catch (Throwable e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Throwing of the objectref on the subclass of Throwable
+     */
+    public void testN3() {
+        T_opc_throw_8 t = new T_opc_throw_8();
+        try {
+            t.run();
+            fail("must throw a Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title Nearest matching catch must be executed in case of exception
+     */
+    public void testN4() {
+        T_opc_throw_12 t = new T_opc_throw_12();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title NullPointerException If objectref is null, opc_throw throws
+     * a NullPointerException instead of objectref
+     */
+    public void testE1() {
+        T_opc_throw_4 t = new T_opc_throw_4();
+        try {
+            t.run();
+            fail("expected NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    /**
+     * @title expected IllegalMonitorStateException
+     */
+    public void testE2() {
+        T_opc_throw_5 t = new T_opc_throw_5();
+        try {
+            t.run();
+            fail("expected IllegalMonitorStateException");
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title  (number of registers)
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dxc.junit.opcodes.opc_throw.jm.T_opc_throw_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dxc.junit.opcodes.opc_throw.jm.T_opc_throw_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * 
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dxc.junit.opcodes.opc_throw.jm.T_opc_throw_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B16 
+     * @title operand must be must be assignment-compatible 
+     * with java.lang.Throwable
+
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dxc.junit.opcodes.opc_throw.jm.T_opc_throw_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d
new file mode 100644
index 0000000..90a4a03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_1.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       new-instance v1, java/lang/RuntimeException
+       invoke-direct {v1}, java/lang/RuntimeException/<init>()V
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java
new file mode 100644
index 0000000..6aa25db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_1 {
+
+    public void run() {
+        throw new RuntimeException();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d
new file mode 100644
index 0000000..c3194bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_10.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+       new-instance v1, java/lang/String
+       invoke-direct {v1}, java/lang/String/<init>()V
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java
new file mode 100644
index 0000000..b57a68c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_10 {
+    
+    public void run() {
+        throw new RuntimeException();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
new file mode 100644
index 0000000..e096f4c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_12.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 2
+
+Label0:
+    invoke-direct {v1}, dot/junit/opcodes/opc_throw/d/T_opc_throw_12/test()Z
+    move-result v0
+    return v0
+Label1:
+    const v0, 0
+    return v0
+
+.catch java/lang/RuntimeException from Label0 to Label1 using Label1
+.end method
+
+
+.method private test()Z
+.limit regs 2
+Label0:
+    new-instance v0, java/lang/RuntimeException
+    invoke-direct {v0}, java/lang/RuntimeException/<init>()V
+    throw  v0
+Label1:
+    const v1, 1
+    return v1
+
+.catch java/lang/RuntimeException from Label0 to Label1 using Label1
+.end method
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java
new file mode 100644
index 0000000..50ef212
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_12 {
+
+    public boolean run() {
+        
+        try{
+            return test();
+        } catch(RuntimeException e2) {
+        }
+        return false;
+    }
+    
+    private boolean test() {
+        try {
+            throw new RuntimeException();
+        } catch(RuntimeException e1) {
+            return true;
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d
new file mode 100644
index 0000000..95c3657
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_2.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+      return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       new-instance v1, java/lang/Throwable
+       invoke-direct {v1}, java/lang/Throwable/<init>()V
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java
new file mode 100644
index 0000000..df4c62d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_2 {
+
+    public void run() throws Throwable {
+        throw new Throwable();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d
new file mode 100644
index 0000000..7ef732a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_3.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       const-wide v1, 314
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d
new file mode 100644
index 0000000..ab5d803
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_4.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/4 v1, 0
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java
new file mode 100644
index 0000000..89c576d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_4 {
+
+    public void run() {
+        throw new RuntimeException();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
new file mode 100644
index 0000000..4e23269
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_5.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public declared_synchronized run()V
+.limit regs 6
+
+       monitor-exit v5
+
+       new-instance v1, java/lang/NullPointerException
+       invoke-direct {v1}, java/lang/NullPointerException/<init>()V
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java
new file mode 100644
index 0000000..748e08c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_5 {
+
+    public synchronized void run() {
+            throw new NullPointerException();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d
new file mode 100644
index 0000000..51ca304
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_6.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       new-instance v1, java/lang/RuntimeException
+       invoke-direct {v1}, java/lang/RuntimeException/<init>()V
+       throw v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d
new file mode 100644
index 0000000..bf85401
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_7.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       const v1, 3.14
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d
new file mode 100644
index 0000000..8b91411
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_opc_throw_8.java
+.class public dot.junit.opcodes.opc_throw.d.T_opc_throw_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       new-instance v1, java/lang/Error
+       invoke-direct {v1}, java/lang/Error/<init>()V
+       throw v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java
new file mode 100644
index 0000000..30dc98a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_8 {
+
+    public void run() throws Error {
+        throw new Error();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java
new file mode 100644
index 0000000..bd173cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.opc_throw.d;
+
+public class T_opc_throw_9 {
+    
+    public void run() {
+        throw new RuntimeException();
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/Test_or_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/Test_or_int.java
new file mode 100644
index 0000000..e2ebcbf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/Test_or_int.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_int.d.T_or_int_1;
+import dot.junit.opcodes.or_int.d.T_or_int_6;
+
+public class Test_or_int extends DxTestCase {
+
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_or_int_1 t = new T_or_int_1();
+        assertEquals(15, t.run(15, 8));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+        T_or_int_1 t = new T_or_int_1();
+        assertEquals(0xfffffff9, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_or_int_1 t = new T_or_int_1();
+        assertEquals(-1, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_int_6 t = new T_or_int_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_int_1 t = new T_or_int_1();
+        assertEquals(-1, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_int_1 t = new T_or_int_1();
+        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int.d.T_or_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int.d.T_or_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int.d.T_or_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int.d.T_or_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.d
new file mode 100644
index 0000000..bac2513
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_1.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.java
new file mode 100644
index 0000000..36da158
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int.d;
+
+public class T_or_int_1 {
+
+    public int run(int a, int b) {
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_2.d
new file mode 100644
index 0000000..9afca45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int v0, v6, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_3.d
new file mode 100644
index 0000000..cc2a413
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_3.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       or-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_4.d
new file mode 100644
index 0000000..f47f082
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_4.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)I
+.limit regs 8
+
+       or-int v0, v5, v6
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_5.d
new file mode 100644
index 0000000..65aee2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_5.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.d
new file mode 100644
index 0000000..5543c18
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_6.java
+.class public dot.junit.opcodes.or_int.d.T_or_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       or-int v0, v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.java
new file mode 100644
index 0000000..9450467
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int/d/T_or_int_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int.d;
+
+public class T_or_int_6 {
+
+    public int run(float a, int b) {
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java
new file mode 100644
index 0000000..1278e42
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_1;
+import dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_6;
+
+public class Test_or_int_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_or_int_2addr_1 t = new T_or_int_2addr_1();
+        assertEquals(15, t.run(15, 8));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+        T_or_int_2addr_1 t = new T_or_int_2addr_1();
+        assertEquals(0xfffffff9, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_or_int_2addr_1 t = new T_or_int_2addr_1();
+        assertEquals(-1, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_int_2addr_6 t = new T_or_int_2addr_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_int_2addr_1 t = new T_or_int_2addr_1();
+        assertEquals(-1, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_int_2addr_1 t = new T_or_int_2addr_1();
+        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d
new file mode 100644
index 0000000..c1d6357
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_1.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java
new file mode 100644
index 0000000..d802576
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_2addr.d;
+
+public class T_or_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d
new file mode 100644
index 0000000..0fe271f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_2.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int/2addr v6, v8
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d
new file mode 100644
index 0000000..f7b8de4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_3.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       or-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d
new file mode 100644
index 0000000..c29c45a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_4.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       or-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d
new file mode 100644
index 0000000..55c9544
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_5.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       or-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d
new file mode 100644
index 0000000..2eb863f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_2addr_6.java
+.class public dot.junit.opcodes.or_int_2addr.d.T_or_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       or-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java
new file mode 100644
index 0000000..271e8ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_2addr.d;
+
+public class T_or_int_2addr_6 {
+
+    public int run(float a, int b) {
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java
new file mode 100644
index 0000000..0595a7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_1;
+import dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_2;
+import dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_3;
+import dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_4;
+import dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_5;
+
+public class Test_or_int_lit16 extends DxTestCase {
+
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_or_int_lit16_1 t = new T_or_int_lit16_1();
+        assertEquals(15, t.run(15));
+    }
+
+    /**
+     * @title Arguments = 0x5ff5, 0x7ff7
+     */
+    public void testN2() {
+        T_or_int_lit16_2 t = new T_or_int_lit16_2();
+        assertEquals(0x7ff7, t.run(0x5ff5));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_or_int_lit16_3 t = new T_or_int_lit16_3();
+        assertEquals(-1, t.run(0xcaf));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_int_lit16_4 t = new T_or_int_lit16_4();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_int_lit16_3 t = new T_or_int_lit16_3();
+        assertEquals(-1, t.run(0));
+    }
+
+    /**
+     * @title Arguments = Short.MAX_VALUE & Short.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_int_lit16_5 t = new T_or_int_lit16_5();
+        assertEquals(0xffffffff, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d
new file mode 100644
index 0000000..2750eb2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_1.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v7, 8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java
new file mode 100644
index 0000000..b9c94bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_1 {
+    
+    public int run(int a) {
+        int b = 8;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d
new file mode 100644
index 0000000..bbddaa9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_2.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v7, 0x7ff7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java
new file mode 100644
index 0000000..b87fd5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_2 {
+    
+    public int run(int a) {
+        int b = 0x7ff7;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d
new file mode 100644
index 0000000..ee50f62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_3.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java
new file mode 100644
index 0000000..bddbf13
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_3 {
+    
+    public int run(int a) {
+        int b = -1;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d
new file mode 100644
index 0000000..2bc0910
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_4.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       or-int/lit16 v0, v7, 15
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java
new file mode 100644
index 0000000..fe01a61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_4 {
+    
+    public int run(float a) {
+        int b = 15;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d
new file mode 100644
index 0000000..a227848
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_5.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v7, 32767
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java
new file mode 100644
index 0000000..f94b3aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_5 {
+    
+    public int run(int b) {
+        int a = Short.MAX_VALUE;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d
new file mode 100644
index 0000000..539491a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_6.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v8, 8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java
new file mode 100644
index 0000000..78c7732
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_6 {
+    
+    public int run(int a) {
+        int b = 8;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d
new file mode 100644
index 0000000..1e28c75
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_7.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       or-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java
new file mode 100644
index 0000000..784592a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_7 {
+    
+    public int run(double a) {
+        int b = 10;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d
new file mode 100644
index 0000000..42150a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_8.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       or-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java
new file mode 100644
index 0000000..0f65388
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_8 {
+    
+    public int run(long a) {
+        int b = 10;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d
new file mode 100644
index 0000000..a810f2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit16_9.java
+.class public dot.junit.opcodes.or_int_lit16.d.T_or_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java
new file mode 100644
index 0000000..96c28ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit16.d;
+
+public class T_or_int_lit16_9 {
+    
+    public int run(int a) {
+        int b = 10;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java
new file mode 100644
index 0000000..a9b697c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_1;
+import dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_2;
+import dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_3;
+import dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_4;
+import dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_5;
+
+public class Test_or_int_lit8 extends DxTestCase {
+
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+        T_or_int_lit8_1 t = new T_or_int_lit8_1();
+        assertEquals(15, t.run(15));
+    }
+
+    /**
+     * @title Arguments = 0x5f, 0x7f
+     */
+    public void testN2() {
+        T_or_int_lit8_2 t = new T_or_int_lit8_2();
+        assertEquals(0x7f, t.run(0x5f));
+    }
+
+    /**
+     * @title Arguments = 0xcafe & -1
+     */
+    public void testN3() {
+        T_or_int_lit8_3 t = new T_or_int_lit8_3();
+        assertEquals(-1, t.run(0xcaf));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_int_lit8_4 t = new T_or_int_lit8_4();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_int_lit8_3 t = new T_or_int_lit8_3();
+        assertEquals(-1, t.run(0));
+    }
+
+    /**
+     * @title Arguments = Short.MAX_VALUE & Short.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_int_lit8_5 t = new T_or_int_lit8_5();
+        assertEquals(0xffffffff, t.run(Byte.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d
new file mode 100644
index 0000000..71967f6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_1.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v7, 8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java
new file mode 100644
index 0000000..eaedd28
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_1 {
+    
+    public int run(int a) {
+        int b = 8;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d
new file mode 100644
index 0000000..44143ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_2.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v7, 0x7f
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java
new file mode 100644
index 0000000..3a93f0e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_2 {
+    
+    public int run(int a) {
+        int b = 0x7f;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d
new file mode 100644
index 0000000..9039138
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_3.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java
new file mode 100644
index 0000000..0c93d21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_3 {
+    
+    public int run(int a) {
+        int b = -1;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d
new file mode 100644
index 0000000..6e07519
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_4.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       or-int/lit8 v0, v7, 15
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java
new file mode 100644
index 0000000..83c991b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_4 {
+    
+    public int run(float a) {
+        int b = 15;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d
new file mode 100644
index 0000000..c765b57
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_5.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v7, 127
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java
new file mode 100644
index 0000000..8cc8560
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_5 {
+    
+    public int run(int a) {
+        int b = Byte.MAX_VALUE;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d
new file mode 100644
index 0000000..3a70209
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_6.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v8, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java
new file mode 100644
index 0000000..5f9478b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_6 {
+    
+    public int run(int a) {
+        int b = 10;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d
new file mode 100644
index 0000000..8040a0e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_7.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       or-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java
new file mode 100644
index 0000000..578692d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_7 {
+    
+    public int run(double a) {
+        int b = 10;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d
new file mode 100644
index 0000000..e0b4801
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_8.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       or-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java
new file mode 100644
index 0000000..a00cb27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_8 {
+    
+    public int run(long a) {
+        int b = 10;
+        return (int)a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d
new file mode 100644
index 0000000..7e44fec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_int_lit8_9.java
+.class public dot.junit.opcodes.or_int_lit8.d.T_or_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       or-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java
new file mode 100644
index 0000000..1a67d00
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_int_lit8.d;
+
+public class T_or_int_lit8_9 {
+    
+    public int run(int a) {
+        int b = 10;
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/Test_or_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/Test_or_long.java
new file mode 100644
index 0000000..87c351e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/Test_or_long.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_long.d.T_or_long_1;
+import dot.junit.opcodes.or_long.d.T_or_long_3;
+
+public class Test_or_long extends DxTestCase {
+
+    /**
+     * @title Arguments = 123456789121l, 2l
+     */
+    public void testN1() {
+        T_or_long_1 t = new T_or_long_1();
+        assertEquals(123456789123l, t.run(123456789121l, 2l));
+    }
+
+    /**
+     * @title Arguments = 0xffffffffffffff8l, 0xffffffffffffff1l
+     */
+    public void testN2() {
+        T_or_long_1 t = new T_or_long_1();
+        assertEquals(0xffffffffffffff9l, t.run(0xffffffffffffff8l,
+                0xffffffffffffff1l));
+    }
+
+    /**
+     * @title Arguments = 0xabcdefabcdef & -1
+     */
+    public void testN3() {
+        T_or_long_1 t = new T_or_long_1();
+        assertEquals(-1l, t.run(0xabcdefabcdefl, -1l));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_long_3 t = new T_or_long_3();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_long_1 t = new T_or_long_1();
+        assertEquals(-1l, t.run(0l, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_long_1 t = new T_or_long_1();
+        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long.d.T_or_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long.d.T_or_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float & long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long.d.T_or_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long.d.T_or_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.d
new file mode 100644
index 0000000..6bc5ef8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_1.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.java
new file mode 100644
index 0000000..0e565cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long.d;
+
+public class T_or_long_1 {
+
+    public long run(long a, long b) {
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_2.d
new file mode 100644
index 0000000..b33694e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long v0, v10, v14
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.d
new file mode 100644
index 0000000..f85ee63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_3.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       or-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.java
new file mode 100644
index 0000000..2a86c48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long.d;
+
+public class T_or_long_3 {
+
+    public long run(long a, double b) {
+        return a | (long)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_4.d
new file mode 100644
index 0000000..89337b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_4.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)J
+.limit regs 14
+
+       or-long v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_5.d
new file mode 100644
index 0000000..91fbc4d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_5.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FJ)J
+.limit regs 14
+
+       or-long v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_6.d
new file mode 100644
index 0000000..ee5c07a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long/d/T_or_long_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_6.java
+.class public dot.junit.opcodes.or_long.d.T_or_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long v0, v9, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java
new file mode 100644
index 0000000..16e34b0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_1;
+import dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_3;
+
+public class Test_or_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 123456789121l, 2l
+     */
+    public void testN1() {
+        T_or_long_2addr_1 t = new T_or_long_2addr_1();
+        assertEquals(123456789123l, t.run(123456789121l, 2l));
+    }
+
+    /**
+     * @title Arguments = 0xffffffffffffff8l, 0xffffffffffffff1l
+     */
+    public void testN2() {
+        T_or_long_2addr_1 t = new T_or_long_2addr_1();
+        assertEquals(0xffffffffffffff9l, t.run(0xffffffffffffff8l,
+                0xffffffffffffff1l));
+    }
+
+    /**
+     * @title Arguments = 0xabcdefabcdef & -1
+     */
+    public void testN3() {
+        T_or_long_2addr_1 t = new T_or_long_2addr_1();
+        assertEquals(-1l, t.run(0xabcdefabcdefl, -1l));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_or_long_2addr_3 t = new T_or_long_2addr_3();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_or_long_2addr_1 t = new T_or_long_2addr_1();
+        assertEquals(-1l, t.run(0l, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_or_long_2addr_1 t = new T_or_long_2addr_1();
+        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float & long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d
new file mode 100644
index 0000000..a7c4859
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_1.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java
new file mode 100644
index 0000000..c82fc8a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long_2addr.d;
+
+public class T_or_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a | b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d
new file mode 100644
index 0000000..f7db657
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_2.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long/2addr v10, v14
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d
new file mode 100644
index 0000000..5604162
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_3.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       or-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java
new file mode 100644
index 0000000..98c77b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.or_long_2addr.d;
+
+public class T_or_long_2addr_3 {
+
+    public long run(long a, double b) {
+        return a | (long)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d
new file mode 100644
index 0000000..a13b59f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_4.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)J
+.limit regs 14
+
+       or-long/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d
new file mode 100644
index 0000000..7d7667d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_5.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FJ)J
+.limit regs 14
+
+       or-long/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d
new file mode 100644
index 0000000..65d1c7b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_or_long_2addr_6.java
+.class public dot.junit.opcodes.or_long_2addr.d.T_or_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       or-long/2addr v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java
new file mode 100644
index 0000000..780a490
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.packed_switch;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.packed_switch.d.T_packed_switch_1;
+import dot.junit.opcodes.packed_switch.d.T_packed_switch_2;
+
+public class Test_packed_switch extends DxTestCase {
+
+    /**
+     * @title try different values
+     */
+    public void testN1() {
+        T_packed_switch_1 t = new T_packed_switch_1();
+        assertEquals(2, t.run(-1));
+
+        assertEquals(-1, t.run(4));
+        assertEquals(20, t.run(2));
+        assertEquals(-1, t.run(5));
+
+        assertEquals(-1, t.run(6));
+        assertEquals(20, t.run(3));
+        assertEquals(-1, t.run(7));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN2() {
+        try {
+            T_packed_switch_2 t = new T_packed_switch_2();
+            t.run(-1.23f);
+        } catch(Throwable t) {
+            
+        }
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_packed_switch_1 t = new T_packed_switch_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_packed_switch_1 t = new T_packed_switch_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_packed_switch_1 t = new T_packed_switch_1();
+        assertEquals(-1, t.run(0));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A7 
+     * @title branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A7
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint A7 
+     * @title offset to table shall be inside method
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A7
+     * @title the size and the list of targets must be consistent. 
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+    /**
+     * @constraint B22
+     * @title packed-switch-data pseudo-instructions must not be reachable by control flow 
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A7
+     * @title table has wrong ident code
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.packed_switch.d.T_packed_switch_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d
new file mode 100644
index 0000000..bd692e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_1.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+       packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java
new file mode 100644
index 0000000..4c56e14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.packed_switch.d;
+
+public class T_packed_switch_1 {
+
+    public int run(int i) {
+        switch (i) {
+        case -1:
+            return 2;
+        case 2:
+        case 3:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d
new file mode 100644
index 0000000..d1d2d03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_11.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh
new file mode 100644
index 0000000..451465e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh
@@ -0,0 +1,272 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 7b3e5055
+    55 50 3E 7B 
+// parsed: offset 12, len 20: signature           : 13de...bd04
+    13 DE 7D 13 9F C2 C8 77 AF 7A EA 9B 47 76 9C 01 E5 F3 BD 04 
+// parsed: offset 32, len 4: file_size           : 608
+    60 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 472 (0x0001d8)
+    D8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 368
+    70 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_11;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 405 (0x000195) "Ljava/lang/Object;"
+    95 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 425 (0x0001a9) "T_packed_switch_11.java"
+    A9 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 450 (0x0001c2) "V"
+    C2 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 453 (0x0001c5) "run"
+    C5 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_11;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_packed_switch_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 458 (0x0001ca)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 CA 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_11.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_11.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 24
+        18 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: packed-switch v4, 0000000a //  +0x0000000a
+            2B 04 0A 00 00 00 
+        // parsed: offset 286, len 2: |0003: const/4 v2, #int -1 // #0xff
+            12 F2 
+        // parsed: offset 288, len 2: |0004: return v2
+            0F 02 
+        // parsed: offset 290, len 2: |0005: const/4 v2, #int 2 // #0x2
+            12 22 
+        // parsed: offset 292, len 2: |0006: return v2
+            0F 02 
+        // parsed: offset 294, len 4: |0007: const/16 v2, #int 20 // #0x14
+            13 02 14 00 
+        // parsed: offset 298, len 2: |0009: return v2
+            0F 02 
+        // parsed: offset 300, len 28: |000a: packed-switch-data (14 units)
+//@mod            00 01 05 00 FF FF FF FF 05 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+            00 01 06 00 FF FF FF FF 05 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 56: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_11;"
+    36 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 2F 64 2F 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 31 31 3B 00 
+// parsed: offset 405, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 425, len 25: TYPE_STRING_DATA_ITEM [5] "T_packed_switch_11.java"
+    17 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 450, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 453, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_11;"
+    // parsed: offset 458, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 459, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 460, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 461, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 462, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 463, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 466, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 468, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 469, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 470, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 472, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 476, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 488, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 500, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 512, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 524, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 536, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 548, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 560, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 572, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 334 (0x00014e)
+        02 20 00 00 08 00 00 00 4E 01 00 00 
+    // parsed: offset 584, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 458 (0x0001ca)
+        00 20 00 00 01 00 00 00 CA 01 00 00 
+    // parsed: offset 596, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 472 (0x0001d8)
+        00 10 00 00 01 00 00 00 D8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java
new file mode 100644
index 0000000..3565f3a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.packed_switch.d;
+
+public class T_packed_switch_11 {
+
+    public int run(int i) {
+        switch (i) {
+        case 1:
+            return 2;
+        }
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d
new file mode 100644
index 0000000..58afb0b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_12.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       goto Label0
+
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+       packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+Label0:       
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d
new file mode 100644
index 0000000..2e7471b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_13.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       goto Label0
+Label0:       
+       packed-switch v4, 0
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+       packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh
new file mode 100644
index 0000000..4bfcca7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 87464e10
+    10 4E 46 87 
+// parsed: offset 12, len 20: signature           : 7bca...1bb2
+    7B CA CF 83 19 C2 CE 39 ED B4 6A 93 F6 BF AF D5 3E F6 1B B2 
+// parsed: offset 32, len 4: file_size           : 608
+    60 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 472 (0x0001d8)
+    D8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 368
+    70 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_13;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 405 (0x000195) "Ljava/lang/Object;"
+    95 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 425 (0x0001a9) "T_packed_switch_13.java"
+    A9 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 450 (0x0001c2) "V"
+    C2 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 453 (0x0001c5) "run"
+    C5 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_13;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_13;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_packed_switch_13.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 458 (0x0001ca)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 CA 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_13.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_13.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 24
+        18 00 00 00 
+    // insns:
+        // parsed: offset 280, len 2: |0000: goto 0001 // +0x0001
+            28 01 
+        // parsed: offset 282, len 6: |0001: packed-switch v4, 0000000c //  +0x0000000b
+            2B 04 0B 00 00 00 
+        // parsed: offset 288, len 2: |0004: const/4 v2, #int -1 // #0xff
+            12 F2 
+        // parsed: offset 290, len 2: |0005: return v2
+            0F 02 
+        // parsed: offset 292, len 2: |0006: const/4 v2, #int 2 // #0x2
+            12 22 
+        // parsed: offset 294, len 2: |0007: return v2
+            0F 02 
+        // parsed: offset 296, len 4: |0008: const/16 v2, #int 20 // #0x14
+            13 02 14 00 
+        // parsed: offset 300, len 2: |000a: return v2
+            0F 02 
+        // parsed: offset 302, len 2: |000b: nop // spacer
+            00 00 
+        // parsed: offset 304, len 24: |000c: packed-switch-data (12 units)
+//@mod            00 01 04 00 00 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+            00 06 04 00 00 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 56: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_13;"
+    36 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 2F 64 2F 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 31 33 3B 00 
+// parsed: offset 405, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 425, len 25: TYPE_STRING_DATA_ITEM [5] "T_packed_switch_13.java"
+    17 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 31 33 2E 6A 61 76 61 00 
+// parsed: offset 450, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 453, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_13;"
+    // parsed: offset 458, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 459, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 460, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 461, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 462, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 463, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 466, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 468, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 469, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 470, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 472, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 476, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 488, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 500, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 512, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 524, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 536, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 548, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 560, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 572, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 334 (0x00014e)
+        02 20 00 00 08 00 00 00 4E 01 00 00 
+    // parsed: offset 584, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 458 (0x0001ca)
+        00 20 00 00 01 00 00 00 CA 01 00 00 
+    // parsed: offset 596, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 472 (0x0001d8)
+        00 10 00 00 01 00 00 00 D8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d
new file mode 100644
index 0000000..a356eb3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_2.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java
new file mode 100644
index 0000000..977aea7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.packed_switch.d;
+
+public class T_packed_switch_2 {
+
+    public int run(float i) {
+        switch ((int)i) {
+        case -1:
+            return 2;
+        case 2:
+        case 3:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d
new file mode 100644
index 0000000..79e9e8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_3.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v5, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d
new file mode 100644
index 0000000..1c3d42b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_4.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 5
+       packed-switch v3, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d
new file mode 100644
index 0000000..c648fbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_5.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 5
+       packed-switch v3, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d
new file mode 100644
index 0000000..9a18602
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_6.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v3, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d
new file mode 100644
index 0000000..ebf9766
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_7.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh
new file mode 100644
index 0000000..d30068e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : efe7503a
+    3A 50 E7 EF 
+// parsed: offset 12, len 20: signature           : eeec...6db9
+    EE EC 3C 7A 99 EE 9C AE 73 67 A0 02 4A 34 19 B6 D1 E8 6D B9 
+// parsed: offset 32, len 4: file_size           : 608
+    60 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 472 (0x0001d8)
+    D8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 368
+    70 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_7;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 404 (0x000194) "Ljava/lang/Object;"
+    94 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 424 (0x0001a8) "T_packed_switch_7.java"
+    A8 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 448 (0x0001c0) "V"
+    C0 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 451 (0x0001c3) "run"
+    C3 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_7;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_7;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_packed_switch_7.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 456 (0x0001c8)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 C8 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_7.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_7.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 24
+        18 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: packed-switch v4, 0000000a //  +0x0000000a
+            2B 04 0A 00 00 00 
+        // parsed: offset 286, len 2: |0003: const/4 v2, #int -1 // #0xff
+            12 F2 
+        // parsed: offset 288, len 2: |0004: return v2
+            0F 02 
+        // parsed: offset 290, len 2: |0005: const/4 v2, #int 2 // #0x2
+            12 22 
+        // parsed: offset 292, len 2: |0006: return v2
+            0F 02 
+        // parsed: offset 294, len 4: |0007: const/16 v2, #int 20 // #0x14
+            13 02 14 00 
+        // parsed: offset 298, len 2: |0009: return v2
+            0F 02 
+        // parsed: offset 300, len 28: |000a: packed-switch-data (14 units)
+//@mod            00 01 05 00 FF FF FF FF 05 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+            00 01 05 00 FF FF FF FF 05 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 01 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_7;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 2F 64 2F 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 37 3B 00 
+// parsed: offset 404, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 424, len 24: TYPE_STRING_DATA_ITEM [5] "T_packed_switch_7.java"
+    16 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 37 2E 6A 61 76 61 00 
+// parsed: offset 448, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 451, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_7;"
+    // parsed: offset 456, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 457, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 458, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 459, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 460, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 461, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 464, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 466, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 467, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 468, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 470, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 472, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 476, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 488, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 500, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 512, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 524, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 536, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 548, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 560, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 572, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 334 (0x00014e)
+        02 20 00 00 08 00 00 00 4E 01 00 00 
+    // parsed: offset 584, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 456 (0x0001c8)
+        00 20 00 00 01 00 00 00 C8 01 00 00 
+    // parsed: offset 596, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 472 (0x0001d8)
+        00 10 00 00 01 00 00 00 D8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java
new file mode 100644
index 0000000..53e1806
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.packed_switch.d;
+
+public class T_packed_switch_7 {
+
+    public int run(int i) {
+        switch (i) {
+        case 1:
+            return 2;
+        case 2:
+        case 3:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d
new file mode 100644
index 0000000..b22771c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_8.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+        packed-switch-end
+Label6:
+       const v2, -1
+       return v2
+Label9:
+       const v2, 2
+       return v2
+Label12:
+       const v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh
new file mode 100644
index 0000000..71189f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 7f5c534c
+    4C 53 5C 7F 
+// parsed: offset 12, len 20: signature           : 97ca...2c6d
+    97 CA 8C F6 19 E5 9D 0D D2 A3 C8 ED 06 77 15 0E AE A8 2C 6D 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_8;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 416 (0x0001a0) "Ljava/lang/Object;"
+    A0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 436 (0x0001b4) "T_packed_switch_8.java"
+    B4 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 460 (0x0001cc) "V"
+    CC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 463 (0x0001cf) "run"
+    CF 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_8;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_packed_switch_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 468 (0x0001d4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_8.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_8.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: packed-switch v4, 00000010 //  +0x00000010
+            2B 04 10 00 00 00 
+        // parsed: offset 286, len 6: |0003: const v2, #float nan // #0xffffffff int
+            14 02 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v2
+            0F 02 
+        // parsed: offset 294, len 6: |0007: const v2, #float 0.000000 // #0x00000002 int
+            14 02 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v2
+            0F 02 
+        // parsed: offset 302, len 6: |000b: const v2, #float 0.000000 // #0x00000014 int
+            14 02 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v2
+            0F 02 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: packed-switch-data (14 units)
+//@mod            00 01 05 00 FF FF FF FF 07 00 00 00 03 00 00 00 03 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 01 05 00 FF FF FF FF 07 00 00 00 03 00 00 00 03 00 00 00 0B 00 00 00 0C 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_8;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 2F 64 2F 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 38 3B 00 
+// parsed: offset 416, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 436, len 24: TYPE_STRING_DATA_ITEM [5] "T_packed_switch_8.java"
+    16 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 460, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 463, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_8;"
+    // parsed: offset 468, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 469, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 470, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 471, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 472, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 473, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 476, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 479, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 480, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 482, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 20 00 00 01 00 00 00 D4 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d
new file mode 100644
index 0000000..217a917
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_packed_switch_9.java
+.class public dot.junit.opcodes.packed_switch.d.T_packed_switch_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+       packed-switch v4, -1
+            Label9    ; -1
+            Label6    ; 0
+            Label6    ; 1
+            Label12    ; 2
+            Label12    ; 3
+       packed-switch-end
+Label6:
+       const/4 v2, -1
+       return v2
+Label9:
+       const/4 v2, 2
+       return v2
+Label12:
+       const/16 v2, 20
+       return v2
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh
new file mode 100644
index 0000000..f499745
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 8b9450f3
+    F3 50 94 8B 
+// parsed: offset 12, len 20: signature           : 70d9...f3d5
+    70 D9 7D E3 97 15 3F D2 B8 B5 72 A3 F9 DE 77 29 3D 5A F3 D5 
+// parsed: offset 32, len 4: file_size           : 608
+    60 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 472 (0x0001d8)
+    D8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 368
+    70 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 334 (0x00014e) "<init>"
+    4E 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 342 (0x000156) "I"
+    56 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "II"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 349 (0x00015d) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_9;"
+    5D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 404 (0x000194) "Ljava/lang/Object;"
+    94 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 424 (0x0001a8) "T_packed_switch_9.java"
+    A8 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 448 (0x0001c0) "V"
+    C0 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 451 (0x0001c3) "run"
+    C3 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_9;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 328 (0x000148)
+    02 00 00 00 00 00 00 00 48 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_packed_switch_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 456 (0x0001c8)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 C8 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_9.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.packed_switch.d.T_packed_switch_9.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 24
+        18 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: packed-switch v4, 0000000a //  +0x0000000a
+//@mod            2B 04 0A 00 00 00 
+            2B 04 0A 01 00 00 
+        // parsed: offset 286, len 2: |0003: const/4 v2, #int -1 // #0xff
+            12 F2 
+        // parsed: offset 288, len 2: |0004: return v2
+            0F 02 
+        // parsed: offset 290, len 2: |0005: const/4 v2, #int 2 // #0x2
+            12 22 
+        // parsed: offset 292, len 2: |0006: return v2
+            0F 02 
+        // parsed: offset 294, len 4: |0007: const/16 v2, #int 20 // #0x14
+            13 02 14 00 
+        // parsed: offset 298, len 2: |0009: return v2
+            0F 02 
+        // parsed: offset 300, len 28: |000a: packed-switch-data (14 units)
+            00 01 05 00 FF FF FF FF 05 00 00 00 03 00 00 00 03 00 00 00 07 00 00 00 07 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 328, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 332, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 334, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 342, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 345, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 349, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_9;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 2F 64 2F 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 39 3B 00 
+// parsed: offset 404, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 424, len 24: TYPE_STRING_DATA_ITEM [5] "T_packed_switch_9.java"
+    16 54 5F 70 61 63 6B 65 64 5F 73 77 69 74 63 68 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 448, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 451, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/packed_switch/d/T_packed_switch_9;"
+    // parsed: offset 456, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 457, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 458, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 459, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 460, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 461, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 464, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 466, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 467, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 468, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 470, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 472, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 476, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 488, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 500, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 512, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 524, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 536, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 548, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 560, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 328 (0x000148)
+        01 10 00 00 01 00 00 00 48 01 00 00 
+    // parsed: offset 572, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 334 (0x00014e)
+        02 20 00 00 08 00 00 00 4E 01 00 00 
+    // parsed: offset 584, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 456 (0x0001c8)
+        00 20 00 00 01 00 00 00 C8 01 00 00 
+    // parsed: offset 596, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 472 (0x0001d8)
+        00 10 00 00 01 00 00 00 D8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/Test_rem_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/Test_rem_double.java
new file mode 100644
index 0000000..bd540d8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/Test_rem_double.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_double.d.T_rem_double_1;
+import dot.junit.opcodes.rem_double.d.T_rem_double_4;
+
+public class Test_rem_double extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(2.7d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(0d, t.run(0, 3.14d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(-0.43999999999999995d, t.run(-3.14d, 2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_rem_double_4 t = new T_rem_double_4();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(-2.7d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(Double.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(0d, t.run(0, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(Double.NaN, t.run(-2.7d, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_rem_double_1 t = new T_rem_double_1();
+        assertEquals(0d, t.run(1, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, -1E-9d
+     */
+    public void testB9() {
+        T_rem_double_1 t = new T_rem_double_1();
+
+        assertEquals(1.543905285031139E-10d, t.run(Double.MAX_VALUE, -1E-9d));
+    }
+
+    /**
+     * @constraint A24
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double.d.T_rem_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double.d.T_rem_double_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double.d.T_rem_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double.d.T_rem_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d
new file mode 100644
index 0000000..2585be4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_double_1.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java
new file mode 100644
index 0000000..11f42f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double.d;
+
+public class T_rem_double_1 {
+
+    public double run(double a, double b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d
new file mode 100644
index 0000000..bacfdfd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_double_2.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double v0, v12, v14
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d
new file mode 100644
index 0000000..87ce2da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_double_3.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)D
+.limit regs 14
+
+       rem-double v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d
new file mode 100644
index 0000000..b917916
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_double_4.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 14
+
+       rem-double v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java
new file mode 100644
index 0000000..52b842d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double.d;
+
+public class T_rem_double_4 {
+
+    public double run(long a, double b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d
new file mode 100644
index 0000000..6a2a11a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d
@@ -0,0 +1,18 @@
+.source T_rem_double_5.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double v0, v9, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d
new file mode 100644
index 0000000..5cb0397
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_double_6.java
+.class public dot.junit.opcodes.rem_double.d.T_rem_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)D
+.limit regs 14
+
+       rem-double v0, v11, v13
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java
new file mode 100644
index 0000000..da7b741
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_1;
+import dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_4;
+
+public class Test_rem_double_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(2.7d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(0d, t.run(0, 3.14d));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(-0.43999999999999995d, t.run(-3.14d, 2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_rem_double_2addr_4 t = new T_rem_double_2addr_4();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB3() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7d, Double.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(-2.7d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(Double.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(0d, t.run(0, -2.7d));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(Double.NaN, t.run(-2.7d, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Double.MAX_VALUE
+     */
+    public void testB8() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+        assertEquals(0d, t.run(1, Double.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, -1E-9d
+     */
+    public void testB9() {
+        T_rem_double_2addr_1 t = new T_rem_double_2addr_1();
+
+        assertEquals(1.543905285031139E-10d, t.run(Double.MAX_VALUE, -1E-9d));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d
new file mode 100644
index 0000000..898b7db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_1.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java
new file mode 100644
index 0000000..bf60eb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double_2addr.d;
+
+public class T_rem_double_2addr_1 {
+    
+    public double run(double a, double b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d
new file mode 100644
index 0000000..923864f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_2.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double/2addr v12, v14
+       return-wide v12
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d
new file mode 100644
index 0000000..5913c80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_3.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)D
+.limit regs 14
+
+       rem-double/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d
new file mode 100644
index 0000000..a146daf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_4.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 14
+
+       rem-double/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java
new file mode 100644
index 0000000..964d640
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_double_2addr.d;
+
+public class T_rem_double_2addr_4 {
+    
+    public double run(long a, double b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d
new file mode 100644
index 0000000..92c22bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_5.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 14
+
+       rem-double/2addr v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d
new file mode 100644
index 0000000..7ea6104
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_rem_double_2addr_6.java
+.class public dot.junit.opcodes.rem_double_2addr.d.T_rem_double_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)D
+.limit regs 14
+
+       rem-double/2addr v11, v13
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/Test_rem_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/Test_rem_float.java
new file mode 100644
index 0000000..2955a04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/Test_rem_float.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_float.d.T_rem_float_1;
+import dot.junit.opcodes.rem_float.d.T_rem_float_6;
+
+public class Test_rem_float extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(2.7f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(0f, t.run(0, 3.14f));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(-0.44000006f, t.run(-3.14f, 2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_rem_float_6 t = new T_rem_float_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(-2.7f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(Float.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(0f, t.run(0, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(Float.NaN, t.run(-2.7f, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(0f, t.run(1, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_rem_float_1 t = new T_rem_float_1();
+        assertEquals(7.2584893E-10f, t.run(Float.MAX_VALUE, -1E-9f));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float.d.T_rem_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float.d.T_rem_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float.d.T_rem_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float.d.T_rem_float_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d
new file mode 100644
index 0000000..a4edaea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_1.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java
new file mode 100644
index 0000000..0c5e640
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float.d;
+
+public class T_rem_float_1 {
+
+    public float run(float a, float b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d
new file mode 100644
index 0000000..8ce3466
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float v0, v7, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d
new file mode 100644
index 0000000..e773a12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_3.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)F
+.limit regs 8
+
+       rem-float v0, v5, v6
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d
new file mode 100644
index 0000000..afde65c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_4.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)F
+.limit regs 8
+
+       rem-float v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d
new file mode 100644
index 0000000..23740bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_5.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d
new file mode 100644
index 0000000..83ac469
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_6.java
+.class public dot.junit.opcodes.rem_float.d.T_rem_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)F
+.limit regs 8
+
+       rem-float v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java
new file mode 100644
index 0000000..d2592a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float.d;
+
+public class T_rem_float_6 {
+
+    public float run(float a, int b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java
new file mode 100644
index 0000000..d0d743a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_1;
+import dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_6;
+
+public class Test_rem_float_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(2.7f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN2() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(0f, t.run(0, 3.14f));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN3() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(-0.44000006f, t.run(-3.14f, 2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_rem_float_2addr_6 t = new T_rem_float_2addr_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB3() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7f, Float.NEGATIVE_INFINITY
+     */
+    public void testB4() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(-2.7f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(Float.NaN, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -2.7
+     */
+    public void testB6() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(0f, t.run(0, -2.7f));
+    }
+
+    /**
+     * @title Arguments = -2.7, 0
+     */
+    public void testB7() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(Float.NaN, t.run(-2.7f, 0));
+    }
+
+    /**
+     * @title Arguments = 1, Float.MAX_VALUE
+     */
+    public void testB8() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(0f, t.run(1, Float.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -1E-9f
+     */
+    public void testB9() {
+        T_rem_float_2addr_1 t = new T_rem_float_2addr_1();
+        assertEquals(7.2584893E-10f, t.run(Float.MAX_VALUE, -1E-9f));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d
new file mode 100644
index 0000000..a5571e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_1.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java
new file mode 100644
index 0000000..521abb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float_2addr.d;
+
+public class T_rem_float_2addr_1 {
+    
+    public float run(float a, float b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d
new file mode 100644
index 0000000..aef48cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_2.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float/2addr v6, v8
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d
new file mode 100644
index 0000000..294652e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_3.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FD)F
+.limit regs 8
+
+       rem-float/2addr v5, v6
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d
new file mode 100644
index 0000000..4c5f1f5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_4.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)F
+.limit regs 8
+
+       rem-float/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d
new file mode 100644
index 0000000..44c82c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_5.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 8
+
+       rem-float/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d
new file mode 100644
index 0000000..4957893
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_float_2addr_6.java
+.class public dot.junit.opcodes.rem_float_2addr.d.T_rem_float_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)F
+.limit regs 8
+
+       rem-float/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java
new file mode 100644
index 0000000..72d01ed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_float_2addr.d;
+
+public class T_rem_float_2addr_6 {
+    
+    public float run(float a, int b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/Test_rem_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/Test_rem_int.java
new file mode 100644
index 0000000..e355a30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/Test_rem_int.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_int.d.T_rem_int_1;
+import dot.junit.opcodes.rem_int.d.T_rem_int_6;
+
+public class Test_rem_int extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(0, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 1073741823, 4
+     */
+    public void testN2() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(3, t.run(1073741823, 4));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(0, t.run(0, 4));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(-1, t.run(-10, 3));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(1, t.run(1073741824, -3));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(-697, t.run(-17895697, -3000));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_int_6 t = new T_rem_int_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB4() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MAX_VALUE
+     */
+    public void testB5() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(1, t.run(1, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_rem_int_1 t = new T_rem_int_1();
+        assertEquals(1, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_int_1 t = new T_rem_int_1();
+        try {
+            t.run(1, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int.d.T_rem_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int.d.T_rem_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int.d.T_rem_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int.d.T_rem_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d
new file mode 100644
index 0000000..25a1ec5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_1.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java
new file mode 100644
index 0000000..a24b8a6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int.d;
+
+public class T_rem_int_1 {
+
+    public int run(int a, int b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d
new file mode 100644
index 0000000..1fa948b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int v0, v7, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d
new file mode 100644
index 0000000..5db617b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_3.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       rem-int v0, v5, v6
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d
new file mode 100644
index 0000000..69aeb8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_4.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       rem-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d
new file mode 100644
index 0000000..d3b2b76
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_5.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d
new file mode 100644
index 0000000..032b8ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_6.java
+.class public dot.junit.opcodes.rem_int.d.T_rem_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       rem-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java
new file mode 100644
index 0000000..074fd8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int.d;
+
+public class T_rem_int_6 {
+
+    public int run(float a, int b) {
+        return (int)a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java
new file mode 100644
index 0000000..f45439b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_1;
+import dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_6;
+
+public class Test_rem_int_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(0, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 1073741823, 4
+     */
+    public void testN2() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(3, t.run(1073741823, 4));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(0, t.run(0, 4));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(-1, t.run(-10, 3));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(1, t.run(1073741824, -3));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(-697, t.run(-17895697, -3000));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_int_2addr_6 t = new T_rem_int_2addr_6();
+        try {
+            t.run(3.14f, 15);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
+     */
+    public void testB4() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MAX_VALUE
+     */
+    public void testB5() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(1, t.run(1, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        assertEquals(1, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_int_2addr_1 t = new T_rem_int_2addr_1();
+        try {
+            t.run(1, 0);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d
new file mode 100644
index 0000000..25a7fca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_1.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java
new file mode 100644
index 0000000..d19c535
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_2addr.d;
+
+public class T_rem_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d
new file mode 100644
index 0000000..0dee98c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_2.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int/2addr v6, v8
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d
new file mode 100644
index 0000000..b76a76a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_3.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(ID)I
+.limit regs 8
+
+       rem-int/2addr v5, v6
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d
new file mode 100644
index 0000000..e3828d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_4.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       rem-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d
new file mode 100644
index 0000000..d684c92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_5.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       rem-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d
new file mode 100644
index 0000000..0e5825c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_2addr_6.java
+.class public dot.junit.opcodes.rem_int_2addr.d.T_rem_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)I
+.limit regs 8
+
+       rem-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java
new file mode 100644
index 0000000..9508f97
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_2addr.d;
+
+public class T_rem_int_2addr_6 {
+
+    public int run(float a, int b) {
+        return (int)a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java
new file mode 100644
index 0000000..3449f86
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_1;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_2;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_3;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_4;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_5;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_6;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_7;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_8;
+import dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_9;
+
+public class Test_rem_int_lit16 extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_rem_int_lit16_1 t = new T_rem_int_lit16_1();
+        assertEquals(0, t.run(8));
+    }
+
+    /**
+     * @title Arguments = 10737, 4
+     */
+    public void testN2() {
+        T_rem_int_lit16_1 t = new T_rem_int_lit16_1();
+        assertEquals(1, t.run(10737));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_int_lit16_1 t = new T_rem_int_lit16_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_int_lit16_1 t = new T_rem_int_lit16_1();
+        assertEquals(-2, t.run(-10));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_int_lit16_2 t = new T_rem_int_lit16_2();
+        assertEquals(1, t.run(22222));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_int_lit16_3 t = new T_rem_int_lit16_3();
+        assertEquals(-2235, t.run(-23235));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_int_lit16_4 t = new T_rem_int_lit16_4();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_rem_int_lit16_5 t = new T_rem_int_lit16_5();
+        assertEquals(0, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_rem_int_lit16_6 t = new T_rem_int_lit16_6();
+        assertEquals(0, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Short.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_rem_int_lit16_6 t = new T_rem_int_lit16_6();
+        assertEquals(0, t.run(Short.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE, 32767
+     */
+    public void testB4() {
+        T_rem_int_lit16_7 t = new T_rem_int_lit16_7();
+        assertEquals(-1, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, 32767
+     */
+    public void testB5() {
+        T_rem_int_lit16_7 t = new T_rem_int_lit16_7();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Arguments = 1, -32768
+     */
+    public void testB6() {
+        T_rem_int_lit16_8 t = new T_rem_int_lit16_8();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_int_lit16_9 t = new T_rem_int_lit16_9();
+        try {
+            t.run(1);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d
new file mode 100644
index 0000000..84c49ed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_1.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, 4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java
new file mode 100644
index 0000000..75963ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_1 {
+    
+    public int run(int a) {
+        int b = 4;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d
new file mode 100644
index 0000000..4cd1fe6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_10.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v8, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d
new file mode 100644
index 0000000..a5d81e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_11.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       rem-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d
new file mode 100644
index 0000000..80cab63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_12.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       rem-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d
new file mode 100644
index 0000000..2e40ee6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_13.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d
new file mode 100644
index 0000000..ebba20d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_2.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, -3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java
new file mode 100644
index 0000000..7f40e12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_2 {
+    
+    public int run(int a) {
+        int b = -3;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d
new file mode 100644
index 0000000..0b65731
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_3.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, -3000
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java
new file mode 100644
index 0000000..ffd9b90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_3 {
+    
+    public int run(int a) {
+        int b = -3000;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d
new file mode 100644
index 0000000..9b96729
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_4.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, 15
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java
new file mode 100644
index 0000000..759ed42
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_4 {
+    
+    public int run(float a) {
+        int b = 15;
+        return (int)a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d
new file mode 100644
index 0000000..96218a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_5.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java
new file mode 100644
index 0000000..7dd4dfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_5 {
+    
+    public int run(int a) {
+        int b = -1;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d
new file mode 100644
index 0000000..9139eec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_6.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java
new file mode 100644
index 0000000..d59e8a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_6 {
+    
+    public int run(int a) {
+        int b = 1;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d
new file mode 100644
index 0000000..9970a21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_7.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, 32767
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java
new file mode 100644
index 0000000..215598b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_7 {
+    
+    public int run(int a) {
+        int b = 32767;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d
new file mode 100644
index 0000000..aa2208b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_8.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, -32768
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java
new file mode 100644
index 0000000..77a94a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_8 {
+    
+    public int run(int a) {
+        int b = -32768;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d
new file mode 100644
index 0000000..91c45f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit16_9.java
+.class public dot.junit.opcodes.rem_int_lit16.d.T_rem_int_lit16_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit16 v0, v7, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java
new file mode 100644
index 0000000..6c6d3cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit16.d;
+
+public class T_rem_int_lit16_9 {
+    
+    public int run(int a) {
+        int b = 0;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java
new file mode 100644
index 0000000..ffeeb40
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_1;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_2;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_3;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_4;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_5;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_6;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_7;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_8;
+import dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_9;
+
+public class Test_rem_int_lit8 extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_rem_int_lit8_1 t = new T_rem_int_lit8_1();
+        assertEquals(0, t.run(8));
+    }
+
+    /**
+     * @title Arguments = 123, 4
+     */
+    public void testN2() {
+        T_rem_int_lit8_1 t = new T_rem_int_lit8_1();
+        assertEquals(3, t.run(123));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_int_lit8_1 t = new T_rem_int_lit8_1();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_int_lit8_1 t = new T_rem_int_lit8_1();
+        assertEquals(-2, t.run(-10));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_int_lit8_2 t = new T_rem_int_lit8_2();
+        assertEquals(0, t.run(123));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_int_lit8_3 t = new T_rem_int_lit8_3();
+        assertEquals(-3, t.run(-123));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_int_lit8_4 t = new T_rem_int_lit8_4();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Byte.MIN_VALUE, -1
+     */
+    public void testB1() {
+        T_rem_int_lit8_5 t = new T_rem_int_lit8_5();
+        assertEquals(0, t.run(Byte.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Byte.MIN_VALUE, 1
+     */
+    public void testB2() {
+        T_rem_int_lit8_6 t = new T_rem_int_lit8_6();
+        assertEquals(0, t.run(Byte.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Byte.MAX_VALUE, 1
+     */
+    public void testB3() {
+        T_rem_int_lit8_6 t = new T_rem_int_lit8_6();
+        assertEquals(0, t.run(Byte.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Short.MIN_VALUE, 127
+     */
+    public void testB4() {
+        T_rem_int_lit8_7 t = new T_rem_int_lit8_7();
+        assertEquals(-2, t.run(Short.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1, 127
+     */
+    public void testB5() {
+        T_rem_int_lit8_7 t = new T_rem_int_lit8_7();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Arguments = 1, -128
+     */
+    public void testB6() {
+        T_rem_int_lit8_8 t = new T_rem_int_lit8_8();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_int_lit8_9 t = new T_rem_int_lit8_9();
+        try {
+            t.run(1);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d
new file mode 100644
index 0000000..7d69475
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_1.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, 4
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java
new file mode 100644
index 0000000..bf0f39d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_1 {
+
+    public int run(int a) {
+        int b = 4;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d
new file mode 100644
index 0000000..15ce8db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_10.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v8, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d
new file mode 100644
index 0000000..9fb2f77
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_11.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       rem-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d
new file mode 100644
index 0000000..cc7cd5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_12.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       rem-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d
new file mode 100644
index 0000000..c35575e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_13.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v6, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d
new file mode 100644
index 0000000..4887086
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_2.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, -3
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java
new file mode 100644
index 0000000..3c05ec4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_2 {
+
+    public int run(int a) {
+        int b = -3;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d
new file mode 100644
index 0000000..43413ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_3.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, -120
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java
new file mode 100644
index 0000000..7e97956
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_3 {
+
+    public int run(int a) {
+        int b = -120;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d
new file mode 100644
index 0000000..48cd590
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_4.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java
new file mode 100644
index 0000000..431ee77
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_4 {
+
+    public int run(float a) {
+        int b = 10;
+        return (int)a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d
new file mode 100644
index 0000000..ec86de1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_5.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java
new file mode 100644
index 0000000..c02f3e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_5 {
+
+    public int run(int a) {
+        int b = -1;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d
new file mode 100644
index 0000000..8300e22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_6.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java
new file mode 100644
index 0000000..92ad4d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_6 {
+
+    public int run(int a) {
+        int b = 1;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d
new file mode 100644
index 0000000..b1eeb15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_7.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, 127
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java
new file mode 100644
index 0000000..b4369d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_7 {
+
+    public int run(int a) {
+        int b = 127;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d
new file mode 100644
index 0000000..08b0729
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_8.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, -128
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java
new file mode 100644
index 0000000..f28f470
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_8 {
+
+    public int run(int a) {
+        int b = -128;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d
new file mode 100644
index 0000000..3c28049
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_int_lit8_9.java
+.class public dot.junit.opcodes.rem_int_lit8.d.T_rem_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       rem-int/lit8 v0, v7, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java
new file mode 100644
index 0000000..5368944
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_int_lit8.d;
+
+public class T_rem_int_lit8_9 {
+
+    public int run(int a) {
+        int b = 0;
+        return a%b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/Test_rem_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/Test_rem_long.java
new file mode 100644
index 0000000..271cd75
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/Test_rem_long.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_long.d.T_rem_long_1;
+import dot.junit.opcodes.rem_long.d.T_rem_long_3;
+
+public class Test_rem_long extends DxTestCase {
+
+    /**
+     * @title Arguments = 10000000000l, 4000000000l
+     */
+    public void testN1() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(2000000000l, t.run(10000000000l, 4000000000l));
+    }
+
+    /**
+     * @title Arguments = 1234567890123l, 123456789l
+     */
+    public void testN2() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(123l, t.run(1234567890123l, 123456789l));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(0l, t.run(0l, 1234567890123l));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(-2000000000l, t.run(-10000000000l, 4000000000l));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(2000000000l, t.run(10000000000l, -4000000000l));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(-2000000000l, t.run(-10000000000l, -4000000000l));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_long_3 t = new T_rem_long_3();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1l
+     */
+    public void testB1() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1l
+     */
+    public void testB2() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1l
+     */
+    public void testB3() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(0l, t.run(Long.MAX_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(-1l, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1l, Long.MAX_VALUE
+     */
+    public void testB5() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(1l, t.run(1l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1l, Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_rem_long_1 t = new T_rem_long_1();
+        assertEquals(1l, t.run(1l, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_long_1 t = new T_rem_long_1();
+        try {
+            t.run(1234567890123l, 0l);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long.d.T_rem_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long.d.T_rem_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long.d.T_rem_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long.d.T_rem_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d
new file mode 100644
index 0000000..37cfd4d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_1.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java
new file mode 100644
index 0000000..34e776a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long.d;
+
+public class T_rem_long_1 {
+
+    public long run(long a, long b) {
+        return a % b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d
new file mode 100644
index 0000000..867c397
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long v0, v12, v14
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d
new file mode 100644
index 0000000..05b4c51
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_3.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       rem-long v0, v10, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java
new file mode 100644
index 0000000..33c00a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long.d;
+
+public class T_rem_long_3 {
+
+    public long run(long a, double b) {
+        return a % (long)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d
new file mode 100644
index 0000000..165258a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_4.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)J
+.limit regs 14
+
+       rem-long v0, v11, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d
new file mode 100644
index 0000000..ab089c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_5.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)J
+.limit regs 14
+
+       rem-long v0, v11, v13
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d
new file mode 100644
index 0000000..eb64800
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_6.java
+.class public dot.junit.opcodes.rem_long.d.T_rem_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long v0, v9, v12
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java
new file mode 100644
index 0000000..e32f69c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_1;
+import dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_3;
+
+public class Test_rem_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 10000000000l, 4000000000l
+     */
+    public void testN1() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(2000000000l, t.run(10000000000l, 4000000000l));
+    }
+
+    /**
+     * @title Arguments = 1234567890123l, 123456789l
+     */
+    public void testN2() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(123l, t.run(1234567890123l, 123456789l));
+    }
+
+    /**
+     * @title Dividend = 0
+     */
+    public void testN3() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(0l, t.run(0l, 1234567890123l));
+    }
+
+    /**
+     * @title Dividend is negative
+     */
+    public void testN4() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(-2000000000l, t.run(-10000000000l, 4000000000l));
+    }
+
+    /**
+     * @title Divisor is negative
+     */
+    public void testN5() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(2000000000l, t.run(10000000000l, -4000000000l));
+    }
+
+    /**
+     * @title Both Dividend and divisor are negative
+     */
+    public void testN6() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(-2000000000l, t.run(-10000000000l, -4000000000l));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_rem_long_2addr_3 t = new T_rem_long_2addr_3();
+        try {
+            t.run(500000l, 1.05d);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, -1l
+     */
+    public void testB1() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1l
+     */
+    public void testB2() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, 1l
+     */
+    public void testB3() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(0l, t.run(Long.MAX_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
+     */
+    public void testB4() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(-1l, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1l, Long.MAX_VALUE
+     */
+    public void testB5() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(1l, t.run(1l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1l, Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        assertEquals(1l, t.run(1l, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Divisor is 0
+     */
+    public void testE1() {
+        T_rem_long_2addr_1 t = new T_rem_long_2addr_1();
+        try {
+            t.run(1234567890123l, 0l);
+            fail("expected ArithmeticException");
+        } catch (ArithmeticException ae) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  (types of arguments - int, long).
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d
new file mode 100644
index 0000000..83c111e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_1.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java
new file mode 100644
index 0000000..197ce60
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long_2addr.d;
+
+public class T_rem_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a % b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d
new file mode 100644
index 0000000..79c9750
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_2.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long/2addr v12, v14
+       return-wide v12
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d
new file mode 100644
index 0000000..4f62b19
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_3.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 14
+
+       rem-long/2addr v10, v12
+       return-wide v10
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java
new file mode 100644
index 0000000..f86c707
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rem_long_2addr.d;
+
+public class T_rem_long_2addr_3 {
+
+    public long run(long a, double b) {
+        return a % (long)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d
new file mode 100644
index 0000000..2d0d1c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_4.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)J
+.limit regs 14
+
+       rem-long/2addr v11, v12
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d
new file mode 100644
index 0000000..7d4ed96
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_5.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JF)J
+.limit regs 14
+
+       rem-long/2addr v11, v13
+       return-wide v11
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d
new file mode 100644
index 0000000..8952ae1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rem_long_2addr_6.java
+.class public dot.junit.opcodes.rem_long_2addr.d.T_rem_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 14
+
+       rem-long/2addr v9, v12
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Runner.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Runner.java
new file mode 100644
index 0000000..a2610ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Runner.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object;
+
+public interface Runner {
+    public void doit();
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/RunnerGenerator.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/RunnerGenerator.java
new file mode 100644
index 0000000..04644d7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/RunnerGenerator.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object;
+
+public interface RunnerGenerator {
+    public Runner run();
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Test_return_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Test_return_object.java
new file mode 100644
index 0000000..9336829
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/Test_return_object.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.return_object.d.T_return_object_1;
+import dot.junit.opcodes.return_object.d.T_return_object_12;
+import dot.junit.opcodes.return_object.d.T_return_object_13;
+import dot.junit.opcodes.return_object.d.T_return_object_2;
+import dot.junit.opcodes.return_object.d.T_return_object_6;
+import dot.junit.opcodes.return_object.d.T_return_object_8;
+
+
+public class Test_return_object extends DxTestCase {
+    /**
+     * @title simple
+     */
+    public void testN1() {
+        T_return_object_1 t = new T_return_object_1();
+        assertEquals("hello", t.run());
+    }
+
+    /**
+     * @title simple
+     */
+    public void testN2() {
+        T_return_object_1 t = new T_return_object_1();
+        assertEquals(t, t.run2());
+    }
+
+    /**
+     * @title return null
+     */
+    public void testN4() {
+        T_return_object_2 t = new T_return_object_2();
+        assertNull(t.run());
+    }
+
+    /**
+     * @title check that frames are discarded and reinstananted correctly
+     */
+    public void testN5() {
+        T_return_object_6 t = new T_return_object_6();
+        assertEquals("hello", t.run());
+    }
+
+
+    /**
+     * @title assignment compatibility (TChild returned as TSuper)
+     */
+    public void testN7() {
+        //@uses dot.junit.opcodes.return_object.d.T_return_object_12
+        //@uses dot.junit.opcodes.return_object.d.TChild
+        //@uses dot.junit.opcodes.return_object.d.TSuper
+        //@uses dot.junit.opcodes.return_object.d.TInterface
+        T_return_object_12 t = new T_return_object_12();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title assignment compatibility (TChild returned as TInterface)
+     */
+    public void testN8() {
+        //@uses dot.junit.opcodes.return_object.d.T_return_object_13
+        //@uses dot.junit.opcodes.return_object.d.TChild
+        //@uses dot.junit.opcodes.return_object.d.TSuper
+        //@uses dot.junit.opcodes.return_object.d.TInterface
+        T_return_object_13 t = new T_return_object_13();
+        assertTrue(t.run());
+    }
+
+    /**
+     * @title Method is synchronized but thread is not monitor owner
+     */
+    public void testE1() {
+        T_return_object_8 t = new T_return_object_8();
+        try {
+            assertTrue(t.run());
+            fail("expected IllegalMonitorStateException");
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B11 
+     * @title method's return type - void
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title method's return type - float
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B11 
+     * @title method's return type - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+  
+    /**
+     * @constraint B1 
+     * @title types of argument - int
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of argument - long
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title assignment incompatible references
+     */
+    public void testVFE8() {
+        //@uses dot.junit.opcodes.return_object.d.T_return_object_14
+        //@uses dot.junit.opcodes.return_object.d.TChild
+        //@uses dot.junit.opcodes.return_object.d.TSuper
+        //@uses dot.junit.opcodes.return_object.d.TInterface
+        try {
+            Class.forName("dxc.junit.opcodes.return_object.jm.T_return_object_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title assignment incompatible references
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.return_object.d.T_return_object_15
+        //@uses dot.junit.opcodes.return_object.Runner
+        //@uses dot.junit.opcodes.return_object.RunnerGenerator
+        //@uses dot.junit.opcodes.return_object.d.TSuper2
+        try {
+            RunnerGenerator rg = (RunnerGenerator) Class.forName(
+                    "dot.junit.opcodes.return_object.d.T_return_object_15").newInstance();
+            Runner r = rg.run();
+            assertFalse(r instanceof Runner);
+            assertFalse(Runner.class.isAssignableFrom(r.getClass()));
+            // only upon invocation of a concrete method,
+            // a java.lang.IncompatibleClassChangeError is thrown
+            r.doit();
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.d
new file mode 100644
index 0000000..b537c47
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.d
@@ -0,0 +1,40 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_1.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 3
+
+       const-string v1, "hello"
+       return-object v1
+.end method
+
+.method public run2()Ljava/lang/Object;
+.limit regs 3
+       return-object v2
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.java
new file mode 100644
index 0000000..ce9aed3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_1.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+public class T_return_object_1 {
+
+    public String run() {
+        return "hello";
+    }
+    
+    public Object run2() {
+        return this;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_10.d
new file mode 100644
index 0000000..66e762a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_10.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_10.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       const v1, 123
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_11.d
new file mode 100644
index 0000000..c632133
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_11.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       const-wide v1, 123
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.d
new file mode 100644
index 0000000..ea4c11a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.d
@@ -0,0 +1,43 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_12.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test()Ldot/junit/opcodes/return_object/d/TSuper;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/return_object/d/TChild
+       invoke-direct {v1}, dot/junit/opcodes/return_object/d/TChild/<init>()V
+       return-object v1
+.end method
+
+.method public run()Z
+.limit regs 4
+
+       invoke-direct {v3}, dot/junit/opcodes/return_object/d/T_return_object_12/test()Ldot/junit/opcodes/return_object/d/TSuper;
+       move-result-object v2
+       instance-of v0, v2, dot/junit/opcodes/return_object/d/TChild
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.java
new file mode 100644
index 0000000..9040acc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_12.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+
+public class T_return_object_12 {
+    
+    private TSuper test() {
+        return new TChild();
+    }
+    
+    public boolean run() {
+        TSuper t = test();
+        return (t instanceof TChild);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.d
new file mode 100644
index 0000000..4cae4ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_13.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test()Ldot/junit/opcodes/return_object/d/TInterface;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/return_object/d/TChild
+       invoke-direct {v1}, dot/junit/opcodes/return_object/d/TChild/<init>()V
+       return-object v1
+.end method
+
+.method public run()Z
+.limit regs 4
+Label0:
+
+       invoke-direct {v3}, dot/junit/opcodes/return_object/d/T_return_object_13/test()Ldot/junit/opcodes/return_object/d/TInterface;
+       move-result-object v2
+       instance-of v2, v2, dot/junit/opcodes/return_object/d/TChild
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.java
new file mode 100644
index 0000000..cb180d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_13.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+
+public class T_return_object_13 {
+    
+    private TInterface test() {
+        return new TChild();
+    }
+    
+    public boolean run() {
+        TInterface t = test();
+        return (t instanceof TChild);
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_14.d
new file mode 100644
index 0000000..cff2b12
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_14.d
@@ -0,0 +1,49 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_14.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_14
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private test()Ldot/junit/opcodes/return_object/d/TChild;
+.limit regs 6
+
+    new-instance v0, dot/junit/opcodes/return_object/d/TSuper
+    invoke-direct {v0}, dot/junit/opcodes/return_object/d/TSuper/<init>()V
+
+    return-object v0
+.end method
+
+
+.method public run()Z
+.limit regs 6
+
+    invoke-direct {v5}, dot/junit/opcodes/return_object/d/T_return_object_14/test()Ldot/junit/opcodes/return_object/d/TChild;
+    move-result-object v1
+
+    instance-of v0, v1, dot/junit/opcodes/return_object/d/TChild
+
+    return v0
+
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_15.d
new file mode 100644
index 0000000..29377fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_15.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_15.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_15
+.super java/lang/Object
+.implements dot/junit/opcodes/return_object/RunnerGenerator
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ldot/junit/opcodes/return_object/Runner;
+.limit regs 5
+
+       new-instance v1, dot/junit/opcodes/return_object/d/TSuper2
+       invoke-direct {v1}, dot/junit/opcodes/return_object/d/TSuper2/<init>()V
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_16.d
new file mode 100644
index 0000000..0b8dc5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_16.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_16.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_16
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+      return-object v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.d
new file mode 100644
index 0000000..f892233
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_2.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       const/4 v1, 0
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.java
new file mode 100644
index 0000000..916dcdd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+public class T_return_object_2 {
+
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_3.d
new file mode 100644
index 0000000..089fde7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_3.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       return-object v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_4.d
new file mode 100644
index 0000000..9b30169
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_4.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()F
+.limit regs 3
+
+      const v2, 3.14    
+      return-object v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_5.d
new file mode 100644
index 0000000..db9df1b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_5.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+      return-object v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.d
new file mode 100644
index 0000000..582bd74
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.d
@@ -0,0 +1,64 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_6.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private static test()Ljava/lang/String;
+.limit regs 5
+
+       const-string v0, "aaa"
+       const-string v1, "bbb"
+       const-string v2, "ccc"
+       const-string v3, "ddd"
+       return-object v3
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 10
+       const-string v1, "a"
+       const-string v2, "b"
+       const-string v3, "c"
+       invoke-static {}, dot/junit/opcodes/return_object/d/T_return_object_6/test()Ljava/lang/String;
+       move-result-object v7
+
+       const-string v8, "ddd"
+       if-ne v7, v8, Label43
+
+       const-string v7, "a"
+       if-ne v1, v7, Label43
+
+       const-string v7, "b"
+       if-ne v2, v7, Label43
+
+       const-string v7, "c"
+       if-ne v3, v7, Label43
+
+       const-string v0, "hello"
+       return-object v0
+Label43:
+       const-string v0, "a"
+       return-object v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.java
new file mode 100644
index 0000000..05cd845
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_6.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+public class T_return_object_6 {
+
+    public String run() {
+        return "hello";
+    }
+    
+    private static String test() {
+        String a = "aaa";
+        String b = "bbb";
+        String c = "ccc";
+        return "ddd";
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
new file mode 100644
index 0000000..bc2f85f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_return_object_8.java
+.class public dot.junit.opcodes.return_object.d.T_return_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private declared_synchronized test()Ljava/lang/String;
+.limit regs 4
+ 
+    monitor-exit v3
+    const-string v0, "abc"
+    return-object v0
+.end method
+
+.method public run()Z
+.limit regs 3
+
+    invoke-direct {v2}, dot/junit/opcodes/return_object/d/T_return_object_8/test()Ljava/lang/String;
+
+    const v0, 1
+    return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.java
new file mode 100644
index 0000000..65fb8e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+public class T_return_object_8 {
+    
+    private synchronized String test() {
+        return "abc";
+    }
+    
+    public boolean run() {
+        test();
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TestStubs.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TestStubs.d
new file mode 100644
index 0000000..44f819f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TestStubs.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source TestStubs.java
+.interface dot.junit.opcodes.return_object.d.TInterface
+
+.source TestStubs.java
+.class dot.junit.opcodes.return_object.d.TSuper 
+.super java/lang/Object
+.implements dot.junit.opcodes.return_object.d.TInterface 
+    
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.source TestStubs.java
+.class dot.junit.opcodes.return_object.d.TChild 
+.super dot.junit.opcodes.return_object.d.TSuper 
+    
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, dot/junit/opcodes/return_object/d/TSuper/<init>()V
+       return-void
+.end method
+
+.source TestStubs.java
+.class dot.junit.opcodes.return_object.d.TSuper2
+.super java/lang/Object
+ 
+    
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.source TestStubs.java
+.class dot.junit.opcodes.return_object.d.TestStubs 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TetsStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TetsStubs.java
new file mode 100644
index 0000000..575ec0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/TetsStubs.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_object.d;
+
+
+interface TInterface{
+    
+}
+
+class TSuper implements TInterface {
+    
+}
+
+class TChild extends TSuper {
+    
+}
+
+class TSuper2 {
+    
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/Test_return_void.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/Test_return_void.java
new file mode 100644
index 0000000..e5903e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/Test_return_void.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_void;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.return_void.d.T_return_void_1;
+import dot.junit.opcodes.return_void.d.T_return_void_3;
+
+public class Test_return_void extends DxTestCase {
+    /**
+     * @title check that frames are discarded and reinstananted correctly
+     */
+    public void testN1() {
+        T_return_void_1 t = new T_return_void_1();
+        assertEquals(123456, t.run());
+    }
+
+
+    /**
+     * @title Method is synchronized but thread is not monitor owner
+     */
+    public void testE1() {
+        T_return_void_3 t = new T_return_void_3();
+        try {
+            assertTrue(t.run());
+            fail("expected IllegalMonitorStateException");
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint B11 
+     * @title method's return type - int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.return_void.d.T_return_void_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title method's return type - reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.return_void.d.T_return_void_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title method's return type - wide
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.return_void.d.T_return_void_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.d
new file mode 100644
index 0000000..739e288
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.d
@@ -0,0 +1,65 @@
+; Copyright (C) 2008 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.
+
+.source T_return_void_1.java
+.class public dot.junit.opcodes.return_void.d.T_return_void_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+    
+    const v1, 1
+    const v2, 2
+    const v3, 3
+        
+    invoke-static {}, dot/junit/opcodes/return_void/d/T_return_void_1/test()V
+
+    const v4, 1    
+    if-ne v1, v4, Label0
+    
+    const v4, 2    
+    if-ne v2, v4, Label0
+
+    const v4, 3
+    if-ne v3, v4, Label0
+    
+    const v0, 123456
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+.method private static test()V
+.limit regs 5
+    
+    const v0, 9999
+    const v1, 0xaaa
+    const v2, 0xbbbb
+    const v3, 0xcccc
+    const v4, 0xdddd
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.java
new file mode 100644
index 0000000..60615c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_void.d;
+
+public class T_return_void_1 {
+
+    public int run() {
+        test();
+        return 123456;
+    }
+    
+    private static void test() {
+        int a = 0xaaaa;
+        int b = 0xbbbb;
+        int c = 0xcccc;
+        return;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
new file mode 100644
index 0000000..ff12b06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
@@ -0,0 +1,44 @@
+; Copyright (C) 2008 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.
+
+.source T_return_void_3.java
+.class public dot.junit.opcodes.return_void.d.T_return_void_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private declared_synchronized test()V
+.limit regs 1
+
+    monitor-exit v0
+    return-void
+.end method
+
+
+
+.method public run()Z
+.limit regs 1
+
+    invoke-direct {v0}, dot/junit/opcodes/return_void/d/T_return_void_3/test()V
+
+    const v0, 1
+    return v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.java
new file mode 100644
index 0000000..de9cb3a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_void.d;
+
+public class T_return_void_3 {
+    
+    private synchronized void test() {
+        return;
+    }
+    
+    public boolean run() {
+        test();
+        return true;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_5.d
new file mode 100644
index 0000000..172f5d0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_void_5.java
+.class public dot.junit.opcodes.return_void.d.T_return_void_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_6.d
new file mode 100644
index 0000000..001e8b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_void_6.java
+.class public dot.junit.opcodes.return_void.d.T_return_void_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 6
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_7.d
new file mode 100644
index 0000000..3aee8df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_void_7.java
+.class public dot.junit.opcodes.return_void.d.T_return_void_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 6
+    
+    return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/Test_return_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/Test_return_wide.java
new file mode 100644
index 0000000..c97f0d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/Test_return_wide.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.return_wide.d.T_return_wide_1;
+import dot.junit.opcodes.return_wide.d.T_return_wide_3;
+
+public class Test_return_wide extends DxTestCase {
+    /**
+     * @title check that frames are discarded and reinstananted correctly
+     */
+    public void testN1() {
+        T_return_wide_1 t = new T_return_wide_1();
+        assertEquals(123456, t.run());
+    }
+
+    /**
+     * @title Method is synchronized but thread is not monitor owner
+     */
+    public void testE1() {
+        T_return_wide_3 t = new T_return_wide_3();
+        try {
+            assertTrue(t.run());
+            fail("expected IllegalMonitorStateException");
+        } catch (IllegalMonitorStateException imse) {
+            // expected
+        }
+    }
+
+
+    /**
+     * @constraint B11 
+     * @title method's return type - int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.return_wide.d.T_return_wide_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B11 
+     * @title method's return type - reference
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.return_wide.d.T_return_wide_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.return_wide.d.T_return_wide_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title return-wide on single-width register
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.return_wide.d.T_return_wide_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d
new file mode 100644
index 0000000..57ffaf3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d
@@ -0,0 +1,71 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_1.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 10
+    
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    
+    const-wide v4, 0xdddd
+        
+    invoke-static {}, dot/junit/opcodes/return_wide/d/T_return_wide_1/test()J
+    move-result-wide v6
+    
+    cmp-long v0, v4, v6
+    if-nez v0, Label0
+
+    const v4, 1    
+    if-ne v1, v4, Label0
+    
+    const v4, 2    
+    if-ne v2, v4, Label0
+
+    const v4, 3
+    if-ne v3, v4, Label0
+    
+    const v0, 123456
+    return v0
+
+Label0:
+    const v0, 0
+    return v0
+.end method
+
+.method private static test()J
+.limit regs 6
+    
+    const v0, 9999
+    const v1, 0xaaa
+    const v2, 0xbbbb
+    const v3, 0xcccc
+    
+    const-wide v4, 0xdddd
+    return-wide v4
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java
new file mode 100644
index 0000000..a96cbef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_wide.d;
+
+public class T_return_wide_1 {
+
+    public int run() {
+        test();
+        return 123456;
+    }
+    
+    private static long test() {
+        int a = 0xaaaa;
+        int b = 0xbbbb;
+        int c = 0xcccc;
+        return 1l;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
new file mode 100644
index 0000000..1a6fdb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_3.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method private declared_synchronized test()D
+.limit regs 4
+
+    monitor-exit v3
+    const-wide v0, 1.0
+    return-wide v0
+.end method
+
+
+
+.method public run()Z
+.limit regs 1
+
+    invoke-direct {v0}, dot/junit/opcodes/return_wide/d/T_return_wide_3/test()D
+
+    const v0, 1
+    return v0
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java
new file mode 100644
index 0000000..b0bae67
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.return_wide.d;
+
+public class T_return_wide_3 {
+    
+    private synchronized long test() {
+        return 1;
+    }
+    
+    public boolean run() {
+        test();
+        return true;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d
new file mode 100644
index 0000000..692ac2b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_5.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 6
+    
+    const v0, 1
+    return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d
new file mode 100644
index 0000000..3360ab7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_6.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 6
+    
+    const-wide v0, 1
+    return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d
new file mode 100644
index 0000000..0363fcc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_7.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 6
+    
+    return-wide v6
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d
new file mode 100644
index 0000000..be64ae1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_return_wide_8.java
+.class public dot.junit.opcodes.return_wide.d.T_return_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 6
+    
+    const v0, 0
+    const v1, 0
+    return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java
new file mode 100644
index 0000000..bb63e7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_1;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_2;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_3;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_4;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_5;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_6;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_7;
+import dot.junit.opcodes.rsub_int.d.T_rsub_int_12;
+
+public class Test_rsub_int extends DxTestCase {
+
+    /**
+     * @title normal test - check different values
+     */
+    public void testN1() {
+        T_rsub_int_1 t = new T_rsub_int_1();
+        assertEquals("Subtest_1 is failed", -4, t.run(8));
+        assertEquals("Subtest_2 is failed",45, t.run1(15));
+        assertEquals("Subtest_3 is failed",0, t.run2(20));
+        assertEquals("Subtest_4 is failed",-35, t.run3(10));
+        assertEquals("Subtest_5 is failed",-20, t.run4(-50));
+        assertEquals("Subtest_6 is failed",20, t.run5(-70));
+    }
+
+    /**
+     * @title normal test - check different values
+     */
+    public void testN2() {
+        T_rsub_int_2 t = new T_rsub_int_2();
+        assertEquals("Subtest_1 is failed",255, t.run(0));
+        assertEquals("Subtest_2 is failed",-32768, t.run1(0));
+        assertEquals("Subtest_3 is failed",-15, t.run2(15));
+        assertEquals("Subtest_4 is failed",123, t.run2(-123));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_rsub_int_12 t = new T_rsub_int_12();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = 0, b-a = -Integer.MAX_VALUE
+     * 2: a = Short.MAX_VALUE, b = 0, b-a = -Short.MAX_VALUE
+     */
+    public void testB1() {
+        T_rsub_int_3 t = new T_rsub_int_3();
+        assertEquals(-Integer.MAX_VALUE, t.run(Integer.MAX_VALUE));
+        assertEquals(-Short.MAX_VALUE, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = 0, b-a = Integer.MIN_VALUE
+     * 2: a = Short.MIN_VALUE, b = 0, b-a = 32768
+     */
+    public void testB2() {
+        T_rsub_int_3 t = new T_rsub_int_3();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(32768, t.run(Short.MIN_VALUE));
+    }
+    
+    /**
+     * @title (a = 0, b = 0, b-a = 0)
+     */
+    public void testB3() {
+        T_rsub_int_3 t = new T_rsub_int_3();
+        assertEquals(0, t.run(0));
+    }
+    
+    /**
+     * @title 
+     * 1: a = 0, b = Short.MAX_VALUE, b-a = Short.MAX_VALUE
+     * 2: a = 1, b = Short.MAX_VALUE, b-a = 32766
+     * 3: a = -1, b = Short.MAX_VALUE, b-a = 32768
+     */
+    public void testB4() {
+        T_rsub_int_4 t = new T_rsub_int_4();
+        assertEquals(Short.MAX_VALUE, t.run(0));
+        assertEquals(32766, t.run(1));
+        assertEquals(32768, t.run(-1));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = Short.MAX_VALUE, b-a = -2147450881
+     * 2: a = Integer.MAX_VALUE, b = Short.MAX_VALUE, b-a = -2147450880
+     * 3: a = Short.MIN_VALUE, b = Short.MAX_VALUE, b-a = 65535
+     */
+    public void testB5() {
+        T_rsub_int_4 t = new T_rsub_int_4();
+        assertEquals(-2147450881, t.run(Integer.MIN_VALUE));
+        assertEquals(-2147450880, t.run(Integer.MAX_VALUE));
+        assertEquals(65535, t.run(Short.MIN_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = 0, b = Short.MIN_VALUE, b-a = Short.MIN_VALUE
+     * 2: a = 1, b = Short.MIN_VALUE, b-a = -32769
+     * 3: a = -1, b = Short.MIN_VALUE, b-a = -32767
+     */
+    public void testB6() {
+        T_rsub_int_5 t = new T_rsub_int_5();
+        assertEquals(Short.MIN_VALUE, t.run(0));
+        assertEquals(-32769, t.run(1));
+        assertEquals(-32767, t.run(-1));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = Short.MIN_VALUE, b-a = 2147450881
+     * 2: a = Integer.MIN_VALUE, b = Short.MIN_VALUE, b-a = 2147450880
+     * 3: a = Short.MAX_VALUE, b = Short.MIN_VALUE, b-a = -65535
+     */
+    public void testB7() {
+        T_rsub_int_5 t = new T_rsub_int_5();
+        assertEquals(2147450881, t.run(Integer.MAX_VALUE));
+        assertEquals(2147450880, t.run(Integer.MIN_VALUE));
+        assertEquals(-65535, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = -1, b-a = Integer.MAX_VALUE
+     * 2: a = Short.MIN_VALUE, b = -1, b-a = Short.MAX_VALUE 
+     */
+    public void testB8() {
+        T_rsub_int_6 t = new T_rsub_int_6();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(Short.MAX_VALUE, t.run(Short.MIN_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = -1, b-a = Integer.MIN_VALUE
+     * 2: a = Short.MAX_VALUE, b = -1, b-a = -32768
+     */
+    public void testB9() {
+        T_rsub_int_6 t = new T_rsub_int_6();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE));
+        assertEquals(-32768, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = 1, b-a = -Integer.MAX_VALUE
+     * 2: a = Integer.MAX_VALUE, b = 1, b-a = -2147483646
+     */
+    public void testB10() {
+        T_rsub_int_7 t = new T_rsub_int_7();
+        assertEquals(-Integer.MAX_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(-2147483646, t.run(Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Short.MIN_VALUE, b = 1, b-a = 32769
+     * 2: a = Short.MAX_VALUE, b = 1, b-a = -32766
+     */
+    public void testB11() {
+        T_rsub_int_7 t = new T_rsub_int_7();
+        assertEquals(32769, t.run(Short.MIN_VALUE));
+        assertEquals(-32766, t.run(Short.MAX_VALUE));
+    }
+    
+    /**
+     * @title (a = 1, b = 1, b-a = 0)
+     */
+    public void testB12() {
+        T_rsub_int_7 t = new T_rsub_int_7();
+        assertEquals(0, t.run(1));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int.d.T_rsub_int_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int.d.T_rsub_int_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int.d.T_rsub_int_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int.d.T_rsub_int_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d
new file mode 100644
index 0000000..b5124e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d
@@ -0,0 +1,67 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_1.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 4
+       return v0
+.end method
+
+.method public run1(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 60
+       return v0
+.end method
+
+.method public run2(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 20
+       return v0
+.end method
+
+.method public run3(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -25
+       return v0
+.end method
+
+.method public run4(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -70
+       return v0
+.end method
+
+.method public run5(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -50
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java
new file mode 100644
index 0000000..f90f354
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_1 {
+    
+    public int run(int a) {
+        int b = 4;
+        return b-a;
+    }
+    
+    public int run1(int a) {
+        int b = 60;
+        return b-a;
+    }
+    
+    public int run2(int a) {
+        int b = 20;
+        return b-a;
+    }
+    
+    public int run3(int a) {
+        int b = -25;
+        return b-a;
+    }
+    
+    public int run4(int a) {
+        int b = -70;
+        return b-a;
+    }
+    
+    public int run5(int a) {
+        int b = -50;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d
new file mode 100644
index 0000000..544a12c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_10.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 4
+
+       rsub-int v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d
new file mode 100644
index 0000000..e9a9b26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_11.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d
new file mode 100644
index 0000000..9c1ffec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_12.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+
+       rsub-int v0, v3, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java
new file mode 100644
index 0000000..d3b3a4d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_12 {
+    
+    public int run(float a) {
+        int b = 10;
+        return b-(int)a;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d
new file mode 100644
index 0000000..4d63eea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_2.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 255
+       return v0
+.end method
+
+.method public run1(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -32768
+       return v0
+.end method
+
+.method public run2(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java
new file mode 100644
index 0000000..b1d8e90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_2 {
+    
+    public int run(int a) {
+        int b = 255;
+        return b-a;
+    }
+    
+    public int run1(int a) {
+        int b = -32768;
+        return b-a;
+    }
+    
+    public int run2(int a) {
+        int b = 0;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d
new file mode 100644
index 0000000..23efe0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_3.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java
new file mode 100644
index 0000000..b060bd2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_3 {
+    
+    public int run(int a) {
+        int b = 0;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d
new file mode 100644
index 0000000..c37f9da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_4.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 32767
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java
new file mode 100644
index 0000000..5b38c5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_4 {
+    
+    public int run(int a) {
+        int b = Short.MAX_VALUE;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d
new file mode 100644
index 0000000..473020a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_5.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -32768
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java
new file mode 100644
index 0000000..259002c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_5 {
+    
+    public int run(int a) {
+        int b = Short.MIN_VALUE;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d
new file mode 100644
index 0000000..e902f19
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_6.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java
new file mode 100644
index 0000000..221f348
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_6 {
+    
+    public int run(int a) {
+        int b = -1;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d
new file mode 100644
index 0000000..6bb3571
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_7.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v3, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java
new file mode 100644
index 0000000..180e76c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int.d;
+
+public class T_rsub_int_7 {
+    
+    public int run(int a) {
+        int b = 1;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d
new file mode 100644
index 0000000..9494e21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_8.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int v0, v4, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d
new file mode 100644
index 0000000..12b5fe4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_9.java
+.class public dot.junit.opcodes.rsub_int.d.T_rsub_int_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 4
+
+       rsub-int v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java
new file mode 100644
index 0000000..44dc89a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_1;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_2;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_3;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_4;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_5;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_6;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_7;
+import dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_12;
+
+public class Test_rsub_int_lit8 extends DxTestCase {
+
+    /**
+     * @title normal test - check different values
+     */
+    public void testN1() {
+        T_rsub_int_lit8_1 t = new T_rsub_int_lit8_1();
+        assertEquals("Subtest_1 is failed", -4, t.run(8));
+        assertEquals("Subtest_2 is failed",45, t.run1(15));
+        assertEquals("Subtest_3 is failed",0, t.run2(20));
+        assertEquals("Subtest_4 is failed",-35, t.run3(10));
+        assertEquals("Subtest_5 is failed",-20, t.run4(-50));
+        assertEquals("Subtest_6 is failed",20, t.run5(-70));
+    }
+
+    /**
+     * @title normal test - check different values
+     */
+    public void testN2() {
+        T_rsub_int_lit8_2 t = new T_rsub_int_lit8_2();
+        assertEquals("Subtest_1 is failed",123, t.run(0));
+        assertEquals("Subtest_2 is failed",-123, t.run1(0));
+        assertEquals("Subtest_3 is failed",-15, t.run2(15));
+        assertEquals("Subtest_4 is failed",85, t.run2(-85));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_rsub_int_lit8_12 t = new T_rsub_int_lit8_12();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = 0, b-a = -Integer.MAX_VALUE
+     * 2: a = Byte.MAX_VALUE, b = 0, b-a = -Byte.MAX_VALUE
+     */
+    public void testB1() {
+        T_rsub_int_lit8_3 t = new T_rsub_int_lit8_3();
+        assertEquals(-Integer.MAX_VALUE, t.run(Integer.MAX_VALUE));
+        assertEquals(-Byte.MAX_VALUE, t.run(Byte.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = 0, b-a = Integer.MIN_VALUE
+     * 2: a = Byte.MIN_VALUE, b = 0, b-a = 128
+     */
+    public void testB2() {
+        T_rsub_int_lit8_3 t = new T_rsub_int_lit8_3();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(128, t.run(Byte.MIN_VALUE));
+    }
+    
+    /**
+     * @title (a = 0, b = 0, b-a = 0)
+     */
+    public void testB3() {
+        T_rsub_int_lit8_3 t = new T_rsub_int_lit8_3();
+        assertEquals(0, t.run(0));
+    }
+    
+    /**
+     * @title 
+     * 1: a = 0, b = Byte.MAX_VALUE, b-a = Byte.MAX_VALUE
+     * 2: a = 1, b = Byte.MAX_VALUE, b-a = 126
+     * 3: a = -1, b = Byte.MAX_VALUE, b-a = 128
+     */
+    public void testB4() {
+        T_rsub_int_lit8_4 t = new T_rsub_int_lit8_4();
+        assertEquals(Byte.MAX_VALUE, t.run(0));
+        assertEquals(126, t.run(1));
+        assertEquals(128, t.run(-1));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = Byte.MAX_VALUE, b-a = -2147483521
+     * 2: a = Integer.MAX_VALUE, b = Byte.MAX_VALUE, b-a = -2147483520
+     * 3: a = Byte.MIN_VALUE, b = Byte.MAX_VALUE, b-a = 255
+     */
+    public void testB5() {
+        T_rsub_int_lit8_4 t = new T_rsub_int_lit8_4();
+        assertEquals(-2147483521, t.run(Integer.MIN_VALUE));
+        assertEquals(-2147483520, t.run(Integer.MAX_VALUE));
+        assertEquals(255, t.run(Byte.MIN_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = 0, b = Byte.MIN_VALUE, b-a = Byte.MIN_VALUE
+     * 2: a = 1, b = Byte.MIN_VALUE, b-a = -129
+     * 3: a = -1, b = Byte.MIN_VALUE, b-a = -127
+     */
+    public void testB6() {
+        T_rsub_int_lit8_5 t = new T_rsub_int_lit8_5();
+        assertEquals(Byte.MIN_VALUE, t.run(0));
+        assertEquals(-129, t.run(1));
+        assertEquals(-127, t.run(-1));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = Byte.MIN_VALUE, b-a = 2147483521
+     * 2: a = Integer.MIN_VALUE, b = Byte.MIN_VALUE, b-a = 2147483520
+     * 3: a = Byte.MAX_VALUE, b = Byte.MIN_VALUE, b-a = -255
+     */
+    public void testB7() {
+        T_rsub_int_lit8_5 t = new T_rsub_int_lit8_5();
+        assertEquals(2147483521, t.run(Integer.MAX_VALUE));
+        assertEquals(2147483520, t.run(Integer.MIN_VALUE));
+        assertEquals(-255, t.run(Byte.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = -1, b-a = Integer.MAX_VALUE
+     * 2: a = Byte.MIN_VALUE, b = -1, b-a = Byte.MAX_VALUE 
+     */
+    public void testB8() {
+        T_rsub_int_lit8_6 t = new T_rsub_int_lit8_6();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(Byte.MAX_VALUE, t.run(Byte.MIN_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MAX_VALUE, b = -1, b-a = Integer.MIN_VALUE
+     * 2: a = Byte.MAX_VALUE, b = -1, b-a = Byte.MIN_VALUE
+     */
+    public void testB9() {
+        T_rsub_int_lit8_6 t = new T_rsub_int_lit8_6();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE));
+        assertEquals(Byte.MIN_VALUE, t.run(Byte.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Integer.MIN_VALUE, b = 1, b-a = -Integer.MAX_VALUE
+     * 2: a = Integer.MAX_VALUE, b = 1, b-a = -2147483646
+     */
+    public void testB10() {
+        T_rsub_int_lit8_7 t = new T_rsub_int_lit8_7();
+        assertEquals(-Integer.MAX_VALUE, t.run(Integer.MIN_VALUE));
+        assertEquals(-2147483646, t.run(Integer.MAX_VALUE));
+    }
+    
+    /**
+     * @title 
+     * 1: a = Byte.MIN_VALUE, b = 1, b-a = 129
+     * 2: a = Byte.MAX_VALUE, b = 1, b-a = -126
+     */
+    public void testB11() {
+        T_rsub_int_lit8_7 t = new T_rsub_int_lit8_7();
+        assertEquals(129, t.run(Byte.MIN_VALUE));
+        assertEquals(-126, t.run(Byte.MAX_VALUE));
+    }
+    
+    /**
+     * @title (a = 1, b = 1, b-a = 0)
+     */
+    public void testB12() {
+        T_rsub_int_lit8_7 t = new T_rsub_int_lit8_7();
+        assertEquals(0, t.run(1));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+
+    /**
+     * @constraint B1
+     * @title types of arguments - double, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d
new file mode 100644
index 0000000..fd45062
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d
@@ -0,0 +1,67 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_1.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 4
+       return v0
+.end method
+
+.method public run1(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 60
+       return v0
+.end method
+
+.method public run2(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 20
+       return v0
+.end method
+
+.method public run3(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -25
+       return v0
+.end method
+
+.method public run4(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -70
+       return v0
+.end method
+
+.method public run5(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -50
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java
new file mode 100644
index 0000000..e489328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_1 {
+    
+    public int run(int a) {
+        int b = 4;
+        return b-a;
+    }
+    
+    public int run1(int a) {
+        int b = 60;
+        return b-a;
+    }
+    
+    public int run2(int a) {
+        int b = 20;
+        return b-a;
+    }
+    
+    public int run3(int a) {
+        int b = -25;
+        return b-a;
+    }
+    
+    public int run4(int a) {
+        int b = -70;
+        return b-a;
+    }
+    
+    public int run5(int a) {
+        int b = -50;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d
new file mode 100644
index 0000000..a8e37a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_10.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d
new file mode 100644
index 0000000..615eede
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_11.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d
new file mode 100644
index 0000000..7490328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_12.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_12
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java
new file mode 100644
index 0000000..9612590
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_12 {
+    
+    public int run(float a) {
+        int b = 10;
+        return b-(int)a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d
new file mode 100644
index 0000000..fa026fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_2.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 123
+       return v0
+.end method
+
+.method public run1(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -123
+       return v0
+.end method
+
+.method public run2(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java
new file mode 100644
index 0000000..036ec06
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_2 {
+    
+    public int run(int a) {
+        int b = 123;
+        return b-a;
+    }
+    
+    public int run1(int a) {
+        int b = -123;
+        return b-a;
+    }
+    
+    public int run2(int a) {
+        int b = 0;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d
new file mode 100644
index 0000000..b9b5c3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_3.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java
new file mode 100644
index 0000000..deb1885
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_3 {
+    
+    public int run(int a) {
+        int b = 0;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d
new file mode 100644
index 0000000..b330a45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_4.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 127
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java
new file mode 100644
index 0000000..72ddcff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_4 {
+    
+    public int run(int a) {
+        int b = Byte.MAX_VALUE;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d
new file mode 100644
index 0000000..77a0e8b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_5.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -128
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java
new file mode 100644
index 0000000..1ec8d63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_5 {
+    
+    public int run(int a) {
+        int b = Byte.MIN_VALUE;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d
new file mode 100644
index 0000000..bd5d5ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_6.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java
new file mode 100644
index 0000000..bfe342c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_6 {
+    
+    public int run(int a) {
+        int b = -1;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d
new file mode 100644
index 0000000..18cd602
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_7.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v3, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java
new file mode 100644
index 0000000..ca23fb0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.rsub_int_lit8.d;
+
+public class T_rsub_int_lit8_7 {
+    
+    public int run(int a) {
+        int b = 1;
+        return b-a;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d
new file mode 100644
index 0000000..69df5ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_8.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v4, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d
new file mode 100644
index 0000000..4db3540
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_rsub_int_lit8_9.java
+.class public dot.junit.opcodes.rsub_int_lit8.d.T_rsub_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 4
+
+       rsub-int/lit8 v0, v2, 10
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/TestStubs.java
new file mode 100644
index 0000000..4c49c61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget;
+
+public class TestStubs {
+    // used by testVFE4
+    private static int TestStubField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/Test_sget.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/Test_sget.java
new file mode 100644
index 0000000..981b19a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/Test_sget.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget.d.T_sget_1;
+import dot.junit.opcodes.sget.d.T_sget_11;
+import dot.junit.opcodes.sget.d.T_sget_12;
+import dot.junit.opcodes.sget.d.T_sget_13;
+import dot.junit.opcodes.sget.d.T_sget_2;
+import dot.junit.opcodes.sget.d.T_sget_5;
+import dot.junit.opcodes.sget.d.T_sget_6;
+import dot.junit.opcodes.sget.d.T_sget_7;
+import dot.junit.opcodes.sget.d.T_sget_8;
+import dot.junit.opcodes.sget.d.T_sget_9;
+
+public class Test_sget extends DxTestCase {
+
+    /**
+     * @title type - int
+     */
+    public void testN1() {
+        T_sget_1 t = new T_sget_1();
+        assertEquals(5, t.run());
+    }
+
+    /**
+     * @title type - float
+     */
+    public void testN2() {
+        T_sget_2 t = new T_sget_2();
+        assertEquals(123f, t.run());
+    }
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget.d.T_sget_1
+        //@uses dot.junit.opcodes.sget.d.T_sget_11
+        T_sget_11 t = new T_sget_11();
+        assertEquals(10, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+        T_sget_5 t = new T_sget_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_9 t = new T_sget_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read integer from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget.d.T_sget_6
+        //@uses dot.junit.opcodes.sget.TestStubs
+        try {
+            new T_sget_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget.d.T_sget_12
+        //@uses dot.junit.opcodes.sget.d.T_sget_1
+        try {
+            new T_sget_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for boolean fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget.d.T_sget_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.d
new file mode 100644
index 0000000..35e5808
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_1.java
+.class public dot.junit.opcodes.sget.d.T_sget_1
+.super java/lang/Object
+
+.field public static i1 I
+.field protected static p1 I
+.field private static pvt1 I
+
+.method static <clinit>()V
+.limit regs 1
+       const/4 v0, 5
+       sput v0, dot.junit.opcodes.sget.d.T_sget_1.i1 I
+
+       const/16 v0, 10
+       sput v0, dot.junit.opcodes.sget.d.T_sget_1.p1 I
+
+       const/16 v0, 20
+       sput v0, dot.junit.opcodes.sget.d.T_sget_1.pvt1 I
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_1.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.java
new file mode 100644
index 0000000..7514f03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_1 {
+    public static int i1 = 5;
+    protected static int p1 = 10;
+    private static int pvt1 = 20;
+    
+    public int run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.d
new file mode 100644
index 0000000..fb446be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_11.java
+.class public dot.junit.opcodes.sget.d.T_sget_11
+.super dot/junit/opcodes/sget/d/T_sget_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget/d/T_sget_1/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_1.p1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.java
new file mode 100644
index 0000000..26c6cb3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_11 extends T_sget_1 {
+
+    public int run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.d
new file mode 100644
index 0000000..b1e9093
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_12.java
+.class public dot.junit.opcodes.sget.d.T_sget_12
+.super dot/junit/opcodes/sget/d/T_sget_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget/d/T_sget_1/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_1.pvt1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.java
new file mode 100644
index 0000000..f4232d3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_12 {
+    public int run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.d
new file mode 100644
index 0000000..7122dbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_13.java
+.class public dot.junit.opcodes.sget.d.T_sget_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_13.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.java
new file mode 100644
index 0000000..a1d862f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_13 {
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_14.d
new file mode 100644
index 0000000..43ed17b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_14.java
+.class public dot.junit.opcodes.sget.d.T_sget_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_15.d
new file mode 100644
index 0000000..a9d65e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_15.java
+.class public dot.junit.opcodes.sget.d.T_sget_15
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_16.d
new file mode 100644
index 0000000..71602db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_16.java
+.class public dot.junit.opcodes.sget.d.T_sget_16
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_16.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_17.d
new file mode 100644
index 0000000..e7bdc56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_17.java
+.class public dot.junit.opcodes.sget.d.T_sget_17
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_18.d
new file mode 100644
index 0000000..62dbc28
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_18.java
+.class public dot.junit.opcodes.sget.d.T_sget_18
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_19.d
new file mode 100644
index 0000000..0f3374d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_19.java
+.class public dot.junit.opcodes.sget.d.T_sget_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.d
new file mode 100644
index 0000000..de5c7cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_2.java
+.class public dot.junit.opcodes.sget.d.T_sget_2
+.super java/lang/Object
+
+.field public static val F
+
+.method static <clinit>()V
+.limit regs 2
+       const v0, 123.0
+       sput v0, dot.junit.opcodes.sget.d.T_sget_2.val F
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()F
+.limit regs 4
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_2.val F
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.java
new file mode 100644
index 0000000..ff7bdee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_2 {
+
+    public static float val = 123.0f;
+    
+    public float run() {
+        return val;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_20.d
new file mode 100644
index 0000000..e03ccd6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_20.java
+.class public dot.junit.opcodes.sget.d.T_sget_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v0, dot.junit.opcodes.sget.d.T_sget_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_3.d
new file mode 100644
index 0000000..1932bb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_3.java
+.class public dot.junit.opcodes.sget.d.T_sget_3
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget v3, dot.junit.opcodes.sget.d.T_sget_3.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.d
new file mode 100644
index 0000000..761c38f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_4.java
+.class public dot.junit.opcodes.sget.d.T_sget_4
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_4.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.dfh
new file mode 100644
index 0000000..4e7aba1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget/d/T_sget_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget/d/T_sget_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 69ff3a97
+    97 3A FF 69 
+// parsed: offset 12, len 20: signature           : 3483...6e37
+    34 83 98 B4 CA 38 A5 6E 4C 43 40 55 16 41 5A 69 D0 18 6E 37 
+// parsed: offset 32, len 4: file_size           : 544
+    20 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 408 (0x000198)
+    98 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 296
+    28 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "I"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/sget/d/T_sget_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 344 (0x000158) "Ljava/lang/Object;"
+    58 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 364 (0x00016c) "T_sget_4.java"
+    6C 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 379 (0x00017b) "V"
+    7B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 382 (0x00017e) "i1"
+    7E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 386 (0x000182) "run"
+    82 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sget/d/T_sget_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "I"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sget/d/T_sget_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 391 (0x000187)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 87 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget.d.T_sget_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget.d.T_sget_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget v1, Ldot/junit/opcodes/sget/d/T_sget_4;.i1:I // field@0000
+//@mod            60 01 00 00 
+            60 01 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 307, len 37: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sget/d/T_sget_4;"
+    23 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 2F 64 2F 54 5F 73 67 65 74 5F 34 3B 00 
+// parsed: offset 344, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 364, len 15: TYPE_STRING_DATA_ITEM [4] "T_sget_4.java"
+    0D 54 5F 73 67 65 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 379, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 382, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 386, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget/d/T_sget_4;"
+    // parsed: offset 391, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 392, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 393, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 394, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 395, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 396, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 397, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 398, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 401, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 403, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 404, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 405, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 407, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 408, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 412, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 424, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 436, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 448, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 460, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 472, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 484, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 496, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 508, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 520, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 391 (0x000187)
+        00 20 00 00 01 00 00 00 87 01 00 00 
+    // parsed: offset 532, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 10 00 00 01 00 00 00 98 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.d
new file mode 100644
index 0000000..544f350
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_5.java
+.class public dot.junit.opcodes.sget.d.T_sget_5
+.super java/lang/Object
+
+.field public i1 I
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const/4 v2, 5
+       iput v2, v3, dot.junit.opcodes.sget.d.T_sget_5.i1 I
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_5.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.java
new file mode 100644
index 0000000..1dac50e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_5 {
+
+    public int i1 = 5;
+    public int run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.d
new file mode 100644
index 0000000..b78b202
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_6.java
+.class public dot.junit.opcodes.sget.d.T_sget_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.TestStubs.TestStubField I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.java
new file mode 100644
index 0000000..8f81780
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_6 {
+    public int run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.d
new file mode 100644
index 0000000..7423dcd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_7.java
+.class public dot.junit.opcodes.sget.d.T_sget_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_7no_class.i1 I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.java
new file mode 100644
index 0000000..8960240
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_7 {
+    public int run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.d
new file mode 100644
index 0000000..915f609
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_8.java
+.class public dot.junit.opcodes.sget.d.T_sget_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.T_sget_8.i1N I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.java
new file mode 100644
index 0000000..17e16f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_8 {
+    public int run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.d
new file mode 100644
index 0000000..831c623
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.d
@@ -0,0 +1,52 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget.d.StubInitError
+.super java/lang/Object
+
+.field public static value I
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput v1, dot.junit.opcodes.sget.d.StubInitError.value I
+       return-void
+.end method
+
+
+.source T_sget_9.java
+.class public dot.junit.opcodes.sget.d.T_sget_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       sget v1, dot.junit.opcodes.sget.d.StubInitError.value I
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.java
new file mode 100644
index 0000000..600a586
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget/d/T_sget_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget.d;
+
+public class T_sget_9 {
+    
+    public int run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/TestStubs.java
new file mode 100644
index 0000000..b353763
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean;
+
+public class TestStubs {
+    // used by testVFE4
+    private static boolean TestStubField = false;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java
new file mode 100644
index 0000000..ccbeb09
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_11;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_12;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_13;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_5;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_6;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_7;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_8;
+import dot.junit.opcodes.sget_boolean.d.T_sget_boolean_9;
+
+public class Test_sget_boolean extends DxTestCase {
+
+    /**
+     * @title get boolean from static field
+     */
+    public void testN1() {
+        T_sget_boolean_1 t = new T_sget_boolean_1();
+        assertEquals(true, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1
+        //@uses dot.junit.opcodes.sget_boolean.d.T_sget_boolean_11
+        T_sget_boolean_11 t = new T_sget_boolean_11();
+        assertEquals(true, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_boolean_5 t = new T_sget_boolean_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_boolean_9 t = new T_sget_boolean_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read boolean from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_boolean_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_boolean.d.T_sget_boolean_6
+        //@uses dot.junit.opcodes.sget_boolean.TestStubs
+        try {
+            new T_sget_boolean_6().run();
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_boolean_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_boolean_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_boolean.d.T_sget_boolean_12
+        //@uses dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1
+        try {
+            new T_sget_boolean_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget_boolean shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_boolean shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_boolean.d.T_sget_boolean_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d
new file mode 100644
index 0000000..1910152
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_1.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1
+.super java/lang/Object
+
+.field public static i1 Z
+.field protected static p1 Z
+.field private static pvt1 Z
+
+.method static <clinit>()V
+.limit regs 1
+       const/4 v0, 1
+       sput-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.i1 Z
+
+       const/16 v0, 1
+       sput-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.p1 Z
+
+       const/16 v0, 1
+       sput-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.pvt1 Z
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java
new file mode 100644
index 0000000..00604c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_1 {
+    public static boolean i1 = true;
+    protected static boolean p1 = true;
+    private static boolean pvt1 = true;
+    
+    public boolean run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d
new file mode 100644
index 0000000..a37791b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_11.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_11
+.super dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.p1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java
new file mode 100644
index 0000000..46e332b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_11 extends T_sget_boolean_1 {
+
+    public boolean run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d
new file mode 100644
index 0000000..a6d38b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_12.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_12
+.super dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_1.pvt1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java
new file mode 100644
index 0000000..74566c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_12 {
+    public boolean run(){
+        return true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d
new file mode 100644
index 0000000..f183859
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_13.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_13.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java
new file mode 100644
index 0000000..f69d590
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d
new file mode 100644
index 0000000..90de215
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_14.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d
new file mode 100644
index 0000000..e09d93c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_15.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_15
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d
new file mode 100644
index 0000000..f6c3529
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_16.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_16
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d
new file mode 100644
index 0000000..25cadc8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_17.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_17
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d
new file mode 100644
index 0000000..871ff9b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_18.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_18
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d
new file mode 100644
index 0000000..1f4f9e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_19.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d
new file mode 100644
index 0000000..79d51ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_20.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v0, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d
new file mode 100644
index 0000000..c3271ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_3.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_3
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-boolean v3, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_3.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d
new file mode 100644
index 0000000..2ef169f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_4.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_4
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_4.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh
new file mode 100644
index 0000000..2c1995e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 70504938
+    38 49 50 70 
+// parsed: offset 12, len 20: signature           : 1b7b...73d9
+    1B 7B 48 9B 96 83 AB B3 90 67 E9 49 E2 EF 20 98 90 CD 73 D9 
+// parsed: offset 32, len 4: file_size           : 568
+    38 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 432 (0x0001b0)
+    B0 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "Ljava/lang/Object;"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 377 (0x000179) "T_sget_boolean_4.java"
+    79 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 400 (0x000190) "V"
+    90 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 403 (0x000193) "Z"
+    93 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 406 (0x000196) "i1"
+    96 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 410 (0x00019a) "run"
+    9A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "Z"
+//     return_type_idx: 3 (0x000003) "Z"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  type_idx: 3 (0x000003) name_idx: 6 (0x000006) "i1"
+    00 00 03 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 7 (0x000007) "run"
+    00 00 01 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_sget_boolean_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 415 (0x00019f)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 9F 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_boolean.d.T_sget_boolean_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_boolean.d.T_sget_boolean_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget-boolean v1, Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;.i1:Z // field@0000
+//@mod            63 01 00 00 
+            63 01 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 53: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 62 6F 6F 6C 65 61 6E 2F 64 2F 54 5F 73 67 65 74 5F 62 6F 6F 6C 65 61 6E 5F 34 3B 00 
+// parsed: offset 357, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 377, len 23: TYPE_STRING_DATA_ITEM [3] "T_sget_boolean_4.java"
+    15 54 5F 73 67 65 74 5F 62 6F 6F 6C 65 61 6E 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 400, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 403, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 406, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 410, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_boolean/d/T_sget_boolean_4;"
+    // parsed: offset 415, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 416, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 417, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 418, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 419, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 420, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 421, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 422, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 425, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 427, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 428, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 429, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 431, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 432, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 436, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 448, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 460, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 472, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 484, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 496, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 508, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 520, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 532, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 544, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 415 (0x00019f)
+        00 20 00 00 01 00 00 00 9F 01 00 00 
+    // parsed: offset 556, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 432 (0x0001b0)
+        00 10 00 00 01 00 00 00 B0 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d
new file mode 100644
index 0000000..8edf874
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_5.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_5
+.super java/lang/Object
+
+.field public i1 Z
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const/4 v2, 1
+       iput-boolean v2, v3, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_5.i1 Z
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_5.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java
new file mode 100644
index 0000000..e8c679a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_5 {
+
+    public boolean i1 = false;
+    public boolean run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d
new file mode 100644
index 0000000..2bd59dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_6.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.TestStubs.TestStubField Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java
new file mode 100644
index 0000000..ecf8943
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_6 {
+    public boolean run(){
+        return true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d
new file mode 100644
index 0000000..32ef38f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_7.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_7no_class.i1 Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java
new file mode 100644
index 0000000..4db0e16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_7 {
+    public boolean run(){
+        return true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d
new file mode 100644
index 0000000..04c780c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_boolean_8.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.T_sget_boolean_8.i1N Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java
new file mode 100644
index 0000000..42cf804
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_8 {
+    public boolean run(){
+        return true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d
new file mode 100644
index 0000000..0cf9a87
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_boolean.d.StubInitError
+.super java/lang/Object
+
+.field public static value Z
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 1
+       div-int/2addr v1, v0
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sget_boolean.d.StubInitError.value Z
+       return-void
+.end method
+
+
+.source T_sget_boolean_9.java
+.class public dot.junit.opcodes.sget_boolean.d.T_sget_boolean_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Z
+.limit regs 3
+
+       sget-boolean v1, dot.junit.opcodes.sget_boolean.d.StubInitError.value Z
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java
new file mode 100644
index 0000000..0956174
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_boolean.d;
+
+public class T_sget_boolean_9 {
+    
+    public boolean run(){
+        return false;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/TestStubs.java
new file mode 100644
index 0000000..3402e8d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte;
+
+public class TestStubs {
+    // used by testVFE4
+    private static byte TestStubField = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java
new file mode 100644
index 0000000..9a19f98
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_1;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_11;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_12;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_13;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_5;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_6;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_7;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_8;
+import dot.junit.opcodes.sget_byte.d.T_sget_byte_9;
+
+public class Test_sget_byte extends DxTestCase {
+
+    /**
+     * @title get byte from static field
+     */
+    public void testN1() {
+        T_sget_byte_1 t = new T_sget_byte_1();
+        assertEquals(77, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_byte.d.T_sget_byte_1
+        //@uses dot.junit.opcodes.sget_byte.d.T_sget_byte_11
+        T_sget_byte_11 t = new T_sget_byte_11();
+        assertEquals(77, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_byte_5 t = new T_sget_byte_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_byte_9 t = new T_sget_byte_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read byte from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_byte_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_byte.d.T_sget_byte_6
+        //@uses dot.junit.opcodes.sget_byte.TestStubs
+        try {
+            new T_sget_byte_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_byte_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_byte_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_byte.d.T_sget_byte_12
+        //@uses dot.junit.opcodes.sget_byte.d.T_sget_byte_1
+        try {
+            new T_sget_byte_12().run();
+            fail("expected a verification exception");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget_byte shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_byte shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_byte.d.T_sget_byte_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d
new file mode 100644
index 0000000..314c2b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_1.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_1
+.super java/lang/Object
+
+.field public static i1 B
+.field protected static p1 B
+.field private static pvt1 B
+
+.method static <clinit>()V
+.limit regs 1
+       const v0, 77
+       sput-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.i1 B
+
+       const v0, 77
+       sput-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.p1 B
+
+       const v0, 77
+       sput-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.pvt1 B
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java
new file mode 100644
index 0000000..e1918b9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_1 {
+    public static byte i1 = 77;
+    protected static byte p1 = 77;
+    private static byte pvt1 = 77;
+    
+    public byte run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d
new file mode 100644
index 0000000..2c6fb91
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_11.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_11
+.super dot/junit/opcodes/sget_byte/d/T_sget_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_byte/d/T_sget_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.p1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java
new file mode 100644
index 0000000..bf69487
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_11 extends T_sget_byte_1 {
+
+    public byte run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d
new file mode 100644
index 0000000..f2be588
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_12.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_12
+.super dot/junit/opcodes/sget_byte/d/T_sget_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_byte/d/T_sget_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_1.pvt1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java
new file mode 100644
index 0000000..cbfb2c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_12 {
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d
new file mode 100644
index 0000000..8da3d7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_13.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_13.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java
new file mode 100644
index 0000000..b2723ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d
new file mode 100644
index 0000000..d64eedc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_14.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d
new file mode 100644
index 0000000..7c02a3b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_15.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_15
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d
new file mode 100644
index 0000000..09e1280
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_16.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_16
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d
new file mode 100644
index 0000000..41d95fb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_17.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_17
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d
new file mode 100644
index 0000000..e95a5eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_18.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_18
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d
new file mode 100644
index 0000000..822c286
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_19.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d
new file mode 100644
index 0000000..e9c6567
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_20.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v0, dot.junit.opcodes.sget_byte.d.T_sget_byte_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d
new file mode 100644
index 0000000..800e5f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_3.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_3
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-byte v3, dot.junit.opcodes.sget_byte.d.T_sget_byte_3.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d
new file mode 100644
index 0000000..5e884e3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_4.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_4
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_4.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh
new file mode 100644
index 0000000..c17b068
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c4b64202
+    02 42 B6 C4 
+// parsed: offset 12, len 20: signature           : e618...6c74
+    E6 18 01 1F 28 B9 CC 8D 4C FC 81 38 DA 39 48 BB 16 05 6C 74 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "B"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_sget_byte_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "B"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "B"
+//     return_type_idx: 0 (0x000000) "B"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_byte_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_byte.d.T_sget_byte_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_byte.d.T_sget_byte_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget-byte v1, Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;.i1:B // field@0000
+//@mod            64 01 00 00 
+            64 01 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "B"
+    01 42 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 62 79 74 65 2F 64 2F 54 5F 73 67 65 74 5F 62 79 74 65 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_sget_byte_4.java"
+    12 54 5F 73 67 65 74 5F 62 79 74 65 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_byte/d/T_sget_byte_4;"
+    // parsed: offset 406, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 407, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d
new file mode 100644
index 0000000..ad5d006
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_5.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_5
+.super java/lang/Object
+
+.field public i1 B
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const v2, 77
+       iput-byte v2, v3, dot.junit.opcodes.sget_byte.d.T_sget_byte_5.i1 B
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_5.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java
new file mode 100644
index 0000000..4391486
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_5 {
+
+    public byte i1 = 77;
+    public byte run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d
new file mode 100644
index 0000000..48a4cb8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_6.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.TestStubs.TestStubField B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java
new file mode 100644
index 0000000..df4e3f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_6 {
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d
new file mode 100644
index 0000000..e887bec
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_7.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_7no_class.i1 B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java
new file mode 100644
index 0000000..b865dde
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_7 {
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d
new file mode 100644
index 0000000..96ab1da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_byte_8.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.T_sget_byte_8.i1N B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java
new file mode 100644
index 0000000..605616f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_8 {
+    public byte run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d
new file mode 100644
index 0000000..aee1a37
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_byte.d.StubInitError
+.super java/lang/Object
+
+.field public static value B
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 1
+       div-int/2addr v1, v0
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sget_byte.d.StubInitError.value B
+       return-void
+.end method
+
+
+.source T_sget_byte_9.java
+.class public dot.junit.opcodes.sget_byte.d.T_sget_byte_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()B
+.limit regs 3
+
+       sget-byte v1, dot.junit.opcodes.sget_byte.d.StubInitError.value B
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java
new file mode 100644
index 0000000..3bd966d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_byte.d;
+
+public class T_sget_byte_9 {
+    
+    public byte run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/TestStubs.java
new file mode 100644
index 0000000..dc99b6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char;
+
+public class TestStubs {
+    // used by testVFE4
+    private static char TestStubField = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/Test_sget_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/Test_sget_char.java
new file mode 100644
index 0000000..10324a5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/Test_sget_char.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_char.d.T_sget_char_1;
+import dot.junit.opcodes.sget_char.d.T_sget_char_11;
+import dot.junit.opcodes.sget_char.d.T_sget_char_12;
+import dot.junit.opcodes.sget_char.d.T_sget_char_13;
+import dot.junit.opcodes.sget_char.d.T_sget_char_5;
+import dot.junit.opcodes.sget_char.d.T_sget_char_6;
+import dot.junit.opcodes.sget_char.d.T_sget_char_7;
+import dot.junit.opcodes.sget_char.d.T_sget_char_8;
+import dot.junit.opcodes.sget_char.d.T_sget_char_9;
+
+public class Test_sget_char extends DxTestCase {
+
+    /**
+     * @title get char from static field
+     */
+    public void testN1() {
+        T_sget_char_1 t = new T_sget_char_1();
+        assertEquals(77, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_char.d.T_sget_char_1
+        //@uses dot.junit.opcodes.sget_char.d.T_sget_char_11
+        T_sget_char_11 t = new T_sget_char_11();
+        assertEquals(77, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_char_5 t = new T_sget_char_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_char_9 t = new T_sget_char_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read char from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_char_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_char.d.T_sget_char_6
+        //@uses dot.junit.opcodes.sget_char.TestStubs
+        try {
+            new T_sget_char_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_char_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_char_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_char.d.T_sget_char_12
+        //@uses dot.junit.opcodes.sget_char.d.T_sget_char_1
+        try {
+            new T_sget_char_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget_char shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_char shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_char.d.T_sget_char_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d
new file mode 100644
index 0000000..5fc252d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_1.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_1
+.super java/lang/Object
+
+.field public static i1 C
+.field protected static p1 C
+.field private static pvt1 C
+
+.method static <clinit>()V
+.limit regs 1
+       const v0, 77
+       sput-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_1.i1 C
+
+       const v0, 77
+       sput-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_1.p1 C
+
+       const v0, 77
+       sput-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_1.pvt1 C
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_1.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java
new file mode 100644
index 0000000..3a606be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_1 {
+    public static char i1 = 77;
+    protected static char p1 = 77;
+    private static char pvt1 = 77;
+    
+    public char run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d
new file mode 100644
index 0000000..d4d3efb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_11.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_11
+.super dot/junit/opcodes/sget_char/d/T_sget_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_char/d/T_sget_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_1.p1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java
new file mode 100644
index 0000000..fd73e27
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_11 extends T_sget_char_1 {
+
+    public char run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d
new file mode 100644
index 0000000..708f2db
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_12.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_12
+.super dot/junit/opcodes/sget_char/d/T_sget_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_char/d/T_sget_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_1.pvt1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java
new file mode 100644
index 0000000..f7affdf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_12 {
+    public char run() {
+        return ' ';
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d
new file mode 100644
index 0000000..eb652bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_13.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_13.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java
new file mode 100644
index 0000000..b347b53
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d
new file mode 100644
index 0000000..c1b8040
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_14.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d
new file mode 100644
index 0000000..dedb8e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_15.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_15
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d
new file mode 100644
index 0000000..82a5544
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_16.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_16
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d
new file mode 100644
index 0000000..abff0e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_17.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_17
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d
new file mode 100644
index 0000000..b73a284
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_18.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_18
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d
new file mode 100644
index 0000000..437c0bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_19.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d
new file mode 100644
index 0000000..eeaff5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_20.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v0, dot.junit.opcodes.sget_char.d.T_sget_char_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d
new file mode 100644
index 0000000..3c6e95d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_3.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_3
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-char v3, dot.junit.opcodes.sget_char.d.T_sget_char_3.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d
new file mode 100644
index 0000000..9aeb10d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_4.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_4
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_4.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh
new file mode 100644
index 0000000..42e44bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_char/d/T_sget_char_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_char/d/T_sget_char_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 15a34188
+    88 41 A3 15 
+// parsed: offset 12, len 20: signature           : 7979...9945
+    79 79 0B 7C 86 0C D4 6D A0 83 40 1C 4E AF AA 03 59 84 99 45 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "C"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/sget_char/d/T_sget_char_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_sget_char_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "C"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sget_char/d/T_sget_char_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "C"
+//     return_type_idx: 0 (0x000000) "C"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sget_char/d/T_sget_char_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_char_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_char.d.T_sget_char_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_char.d.T_sget_char_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget-char v1, Ldot/junit/opcodes/sget_char/d/T_sget_char_4;.i1:C // field@0000
+//@mod            65 01 00 00 
+            65 01 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "C"
+    01 43 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sget_char/d/T_sget_char_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 63 68 61 72 2F 64 2F 54 5F 73 67 65 74 5F 63 68 61 72 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_sget_char_4.java"
+    12 54 5F 73 67 65 74 5F 63 68 61 72 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_char/d/T_sget_char_4;"
+    // parsed: offset 406, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 407, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d
new file mode 100644
index 0000000..fe1c7ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_5.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_5
+.super java/lang/Object
+
+.field public i1 C
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const v2, 77
+       iput-char v2, v3, dot.junit.opcodes.sget_char.d.T_sget_char_5.i1 C
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_5.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java
new file mode 100644
index 0000000..00fb8ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_5 {
+
+    public char i1 = 77;
+    public char run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d
new file mode 100644
index 0000000..f984ada
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_6.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.TestStubs.TestStubField C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java
new file mode 100644
index 0000000..7fc0f38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_6 {
+    public char run() {
+        return ' ';
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d
new file mode 100644
index 0000000..d7b5e35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_7.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_7no_class.i1 C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java
new file mode 100644
index 0000000..616d9f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_7 {
+    public char run() {
+        return ' ';
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d
new file mode 100644
index 0000000..89ac2c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_char_8.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.T_sget_char_8.i1N C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java
new file mode 100644
index 0000000..78e63e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_8 {
+    public char run() {
+        return ' ';
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d
new file mode 100644
index 0000000..cbb4a54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_char.d.StubInitError
+.super java/lang/Object
+
+.field public static value C
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 1
+       div-int/2addr v1, v0
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sget_char.d.StubInitError.value C
+       return-void
+.end method
+
+
+.source T_sget_char_9.java
+.class public dot.junit.opcodes.sget_char.d.T_sget_char_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()C
+.limit regs 3
+
+       sget-char v1, dot.junit.opcodes.sget_char.d.StubInitError.value C
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java
new file mode 100644
index 0000000..bc84d1e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_char.d;
+
+public class T_sget_char_9 {
+    
+    public char run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/TestStubs.java
new file mode 100644
index 0000000..68b9ec7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object;
+
+public class TestStubs {
+    // used by testVFE4
+    private static Object TestStubField = null;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/Test_sget_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/Test_sget_object.java
new file mode 100644
index 0000000..88aa4cb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/Test_sget_object.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_object.d.T_sget_object_1;
+import dot.junit.opcodes.sget_object.d.T_sget_object_11;
+import dot.junit.opcodes.sget_object.d.T_sget_object_12;
+import dot.junit.opcodes.sget_object.d.T_sget_object_13;
+import dot.junit.opcodes.sget_object.d.T_sget_object_21;
+import dot.junit.opcodes.sget_object.d.T_sget_object_5;
+import dot.junit.opcodes.sget_object.d.T_sget_object_6;
+import dot.junit.opcodes.sget_object.d.T_sget_object_7;
+import dot.junit.opcodes.sget_object.d.T_sget_object_8;
+import dot.junit.opcodes.sget_object.d.T_sget_object_9;
+
+public class Test_sget_object extends DxTestCase {
+
+    /**
+     * @title get object from static field
+     */
+    public void testN1() {
+        T_sget_object_1 t = new T_sget_object_1();
+        assertEquals(null, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_object.d.T_sget_object_1
+        //@uses dot.junit.opcodes.sget_object.d.T_sget_object_11
+        T_sget_object_11 t = new T_sget_object_11();
+        assertEquals(null, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_object_5 t = new T_sget_object_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_object_9 t = new T_sget_object_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read object from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_object_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_object.d.T_sget_object_6
+        //@uses dot.junit.opcodes.sget_object.TestStubs
+        try {
+            new T_sget_object_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_object_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_object_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_object.d.T_sget_object_12
+        //@uses dot.junit.opcodes.sget_object.d.T_sget_object_1
+        try {
+            new T_sget_object_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget_object shall not work for short fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for char fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_object shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_object.d.T_sget_object_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title only field of different type exists)
+     */
+    public void testVFE15() {
+        try {
+            new T_sget_object_21().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d
new file mode 100644
index 0000000..e77f532
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_1.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_1
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+.field protected static p1 Ljava/lang/Object;
+.field private static pvt1 Ljava/lang/Object;
+
+.method static <clinit>()V
+.limit regs 1
+       const v0, 0
+       sput-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_1.i1 Ljava/lang/Object;
+
+       const v0, 0
+       sput-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_1.p1 Ljava/lang/Object;
+
+       const v0, 0
+       sput-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_1.pvt1 Ljava/lang/Object;
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_1.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java
new file mode 100644
index 0000000..bcfe83b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_1 {
+    public static Object i1 = null;
+    protected static Object p1 = null;
+    private static Object pvt1 = null;
+    
+    public Object run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d
new file mode 100644
index 0000000..54e497c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_11.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_11
+.super dot/junit/opcodes/sget_object/d/T_sget_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_object/d/T_sget_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_1.p1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java
new file mode 100644
index 0000000..9b8ce6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_11 extends T_sget_object_1 {
+
+    public Object run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d
new file mode 100644
index 0000000..b73c407
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_12.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_12
+.super dot/junit/opcodes/sget_object/d/T_sget_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_object/d/T_sget_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_1.pvt1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java
new file mode 100644
index 0000000..0978a26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_12 {
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d
new file mode 100644
index 0000000..37a8cb5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_13.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_13.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java
new file mode 100644
index 0000000..7fe275e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d
new file mode 100644
index 0000000..1455ebd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_14.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_14
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_14.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d
new file mode 100644
index 0000000..0634476
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_15.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_15
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_15.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d
new file mode 100644
index 0000000..42db7a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_16.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_16
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d
new file mode 100644
index 0000000..0a3ba48
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_17.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_17
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d
new file mode 100644
index 0000000..ca498f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_18.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_18
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d
new file mode 100644
index 0000000..dfcad9b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_19.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d
new file mode 100644
index 0000000..89e7bfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_20.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d
new file mode 100644
index 0000000..ddb0713
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_21.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_21
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method static <clinit>()V
+.limit regs 1
+       new-instance v0, java/lang/Object
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       
+       sput-object v0, dot.junit.opcodes.sget_object.d.T_sget_object_21.i1 Ljava/lang/Object;
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/String;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_21.i1 Ljava/lang/String;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java
new file mode 100644
index 0000000..0343390
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_21 {
+    public String run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d
new file mode 100644
index 0000000..498a01a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_3.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_3
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-object v3, dot.junit.opcodes.sget_object.d.T_sget_object_3.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d
new file mode 100644
index 0000000..d00c4a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_4.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_4
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_4.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh
new file mode 100644
index 0000000..1c40c8c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh
@@ -0,0 +1,262 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_object/d/T_sget_object_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_object/d/T_sget_object_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : a1514422
+    22 44 51 A1 
+// parsed: offset 12, len 20: signature           : b308...2562
+    B3 08 01 4F 75 89 6C 79 7C 97 5C 84 37 60 65 F6 AF 62 25 62 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 156 (0x00009c)
+    9C 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 188 (0x0000bc)
+    BC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 212 (0x0000d4)
+    D4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 244 (0x0000f4)
+    F4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "L"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/sget_object/d/T_sget_object_4;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_sget_object_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 396 (0x00018c) "V"
+    8C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 399 (0x00018f) "i1"
+    8F 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "run"
+    93 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sget_object/d/T_sget_object_4;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 156, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "L"
+//     return_type_idx: 1 (0x000001) "Ljava/lang/Object;"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 00 00 00 00 
+// parsed: offset 168, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  type_idx: 1 (0x000001) name_idx: 6 (0x000006) "i1"
+    00 00 01 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 188, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 196, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 204, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 212, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sget_object/d/T_sget_object_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_object_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 408 (0x000198)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 98 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_object.d.T_sget_object_4.<init>"
+    // parsed: offset 244, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 246, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 248, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 250, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 252, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 256, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 260, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 266, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_object.d.T_sget_object_4.run"
+    // parsed: offset 268, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 270, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 272, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 274, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 276, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 280, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 284, len 4: |0000: sget-object v1, Ldot/junit/opcodes/sget_object/d/T_sget_object_4;.i1:Ljava/lang/Object; // field@0000
+//@mod            62 01 00 00 
+            62 01 00 01 
+        // parsed: offset 288, len 2: |0002: return-object v1
+            11 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 290, len 2: PADDING
+    00 00 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "L"
+    01 4C 00 
+// parsed: offset 303, len 51: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sget_object/d/T_sget_object_4;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 6F 62 6A 65 63 74 2F 64 2F 54 5F 73 67 65 74 5F 6F 62 6A 65 63 74 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 22: TYPE_STRING_DATA_ITEM [4] "T_sget_object_4.java"
+    14 54 5F 73 67 65 74 5F 6F 62 6A 65 63 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 396, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 399, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 403, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_object/d/T_sget_object_4;"
+    // parsed: offset 408, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 409, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 410, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 411, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 412, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 413, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 414, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 415, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 418, len 2: code_off: 244 (0x0000f4)
+                F4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 420, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 421, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 422, len 2: code_off: 268 (0x00010c)
+                8C 02 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 144 (0x000090)
+        02 00 00 00 03 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 156 (0x00009c)
+        03 00 00 00 02 00 00 00 9C 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 180 (0x0000b4)
+        04 00 00 00 01 00 00 00 B4 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 188 (0x0000bc)
+        05 00 00 00 03 00 00 00 BC 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 212 (0x0000d4)
+        06 00 00 00 01 00 00 00 D4 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 244 (0x0000f4)
+        01 20 00 00 02 00 00 00 F4 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 292 (0x000124)
+        02 20 00 00 08 00 00 00 24 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 20 00 00 01 00 00 00 98 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d
new file mode 100644
index 0000000..35687ab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_5.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_5
+.super java/lang/Object
+
+.field public i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const v2, 0
+       iput-object v2, v3, dot.junit.opcodes.sget_object.d.T_sget_object_5.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_5.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java
new file mode 100644
index 0000000..116ae52
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_5 {
+
+    public Object i1 = null;
+    public Object run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d
new file mode 100644
index 0000000..03483da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_6.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.TestStubs.TestStubField Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java
new file mode 100644
index 0000000..84714b2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_6 {
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d
new file mode 100644
index 0000000..eb172eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_7.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_7no_class.i1 Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java
new file mode 100644
index 0000000..56fbd35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_7 {
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d
new file mode 100644
index 0000000..841a454
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_object_8.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.T_sget_object_8.i1N Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java
new file mode 100644
index 0000000..87afe69
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_8 {
+    public Object run() {
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d
new file mode 100644
index 0000000..efd184b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_object.d.StubInitError
+.super java/lang/Object
+
+.field public static value Ljava/lang/Object;
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 1
+       div-int/2addr v1, v0
+
+       const v1, 0
+       sput-object v1, dot.junit.opcodes.sget_object.d.StubInitError.value Ljava/lang/Object;
+       return-void
+.end method
+
+
+.source T_sget_object_9.java
+.class public dot.junit.opcodes.sget_object.d.T_sget_object_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()Ljava/lang/Object;
+.limit regs 3
+
+       sget-object v1, dot.junit.opcodes.sget_object.d.StubInitError.value Ljava/lang/Object;
+       return-object v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java
new file mode 100644
index 0000000..4fbae55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_object.d;
+
+public class T_sget_object_9 {
+    
+    public Object run(){
+        return null;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/TestStubs.java
new file mode 100644
index 0000000..3e5605b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short;
+
+public class TestStubs {
+    // used by testVFE4
+    private static short TestStubField = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/Test_sget_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/Test_sget_short.java
new file mode 100644
index 0000000..b38ef29
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/Test_sget_short.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_short.d.T_sget_short_1;
+import dot.junit.opcodes.sget_short.d.T_sget_short_11;
+import dot.junit.opcodes.sget_short.d.T_sget_short_12;
+import dot.junit.opcodes.sget_short.d.T_sget_short_13;
+import dot.junit.opcodes.sget_short.d.T_sget_short_5;
+import dot.junit.opcodes.sget_short.d.T_sget_short_6;
+import dot.junit.opcodes.sget_short.d.T_sget_short_7;
+import dot.junit.opcodes.sget_short.d.T_sget_short_8;
+import dot.junit.opcodes.sget_short.d.T_sget_short_9;
+
+public class Test_sget_short extends DxTestCase {
+
+    /**
+     * @title get short from static field
+     */
+    public void testN1() {
+        T_sget_short_1 t = new T_sget_short_1();
+        assertEquals(32000, t.run());
+    }
+
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_short.d.T_sget_short_1
+        //@uses dot.junit.opcodes.sget_short.d.T_sget_short_11
+        T_sget_short_11 t = new T_sget_short_11();
+        assertEquals(32000, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_short_5 t = new T_sget_short_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sget_short_9 t = new T_sget_short_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read short from long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_short_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_short.d.T_sget_short_6
+        //@uses dot.junit.opcodes.sget_short.TestStubs
+        try {
+            new T_sget_short_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_short_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_short_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_short.d.T_sget_short_12
+        //@uses dot.junit.opcodes.sget_short.d.T_sget_short_1
+        try {
+            new T_sget_short_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget_short shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for char fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for int fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for byte fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for boolean fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for double fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget_short shall not work for long fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_short.d.T_sget_short_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d
new file mode 100644
index 0000000..777253e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_1.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_1
+.super java/lang/Object
+
+.field public static i1 S
+.field protected static p1 S
+.field private static pvt1 S
+
+.method static <clinit>()V
+.limit regs 1
+       const v0, 32000
+       sput-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_1.i1 S
+
+       const v0, 32000
+       sput-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_1.p1 S
+
+       const v0, 32000
+       sput-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_1.pvt1 S
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_1.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java
new file mode 100644
index 0000000..5cb80f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_1 {
+    public static short i1 = 32000;
+    protected static short p1 = 32000;
+    private static short pvt1 = 32000;
+    
+    public short run(){
+        return i1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d
new file mode 100644
index 0000000..d0f87a4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_11.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_11
+.super dot/junit/opcodes/sget_short/d/T_sget_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_short/d/T_sget_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_1.p1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java
new file mode 100644
index 0000000..790a0de
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_11 extends T_sget_short_1 {
+
+    public short run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d
new file mode 100644
index 0000000..7a0a307
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_12.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_12
+.super dot/junit/opcodes/sget_short/d/T_sget_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_short/d/T_sget_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_1.pvt1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java
new file mode 100644
index 0000000..ea41518
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_12 {
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d
new file mode 100644
index 0000000..b37df82
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_13.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_13
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_13.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java
new file mode 100644
index 0000000..4bc3105
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_13 {
+    public void run(){
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d
new file mode 100644
index 0000000..3d79cd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_14.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d
new file mode 100644
index 0000000..d8751e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_15.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_15
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_15.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d
new file mode 100644
index 0000000..48f416c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_16.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_16
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_16.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d
new file mode 100644
index 0000000..1cc7398
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_17.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_17
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_17.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d
new file mode 100644
index 0000000..7f3ff6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_18.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_18
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_18.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d
new file mode 100644
index 0000000..b9841ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_19.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_19
+.super java/lang/Object
+
+.field public static i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_19.i1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d
new file mode 100644
index 0000000..1ae3803
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_20.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_20
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v0, dot.junit.opcodes.sget_short.d.T_sget_short_20.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d
new file mode 100644
index 0000000..9dcbd24
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_3.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_3
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-short v3, dot.junit.opcodes.sget_short.d.T_sget_short_3.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d
new file mode 100644
index 0000000..ab070e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_4.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_4
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_4.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh
new file mode 100644
index 0000000..c19a74a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_short/d/T_sget_short_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_short/d/T_sget_short_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 4d504536
+    36 45 50 4D 
+// parsed: offset 12, len 20: signature           : d415...9794
+    D4 15 7B CD 4D D8 21 C3 FF 53 0E DE B1 2F 9E 3D 0D 47 97 94 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "Ldot/junit/opcodes/sget_short/d/T_sget_short_4;"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 353 (0x000161) "Ljava/lang/Object;"
+    61 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 373 (0x000175) "S"
+    75 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 376 (0x000178) "T_sget_short_4.java"
+    78 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 397 (0x00018d) "V"
+    8D 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 400 (0x000190) "i1"
+    90 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 404 (0x000194) "run"
+    94 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/sget_short/d/T_sget_short_4;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "S"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 3 (0x000003) "S"
+//     return_type_idx: 2 (0x000002) "S"
+//     parameters_off: 0 (0x000000)
+    03 00 00 00 02 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 0 (0x000000)  type_idx: 2 (0x000002) name_idx: 6 (0x000006) "i1"
+    00 00 02 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    00 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    00 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sget_short/d/T_sget_short_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_short_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 409 (0x000199)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 99 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_short.d.T_sget_short_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_short.d.T_sget_short_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget-short v1, Ldot/junit/opcodes/sget_short/d/T_sget_short_4;.i1:S // field@0000
+//@mod            66 01 00 00 
+            66 01 00 01 
+        // parsed: offset 292, len 2: |0002: return v1
+            0F 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 49: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/sget_short/d/T_sget_short_4;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 73 68 6F 72 74 2F 64 2F 54 5F 73 67 65 74 5F 73 68 6F 72 74 5F 34 3B 00 
+// parsed: offset 353, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 373, len 3: TYPE_STRING_DATA_ITEM [3] "S"
+    01 53 00 
+// parsed: offset 376, len 21: TYPE_STRING_DATA_ITEM [4] "T_sget_short_4.java"
+    13 54 5F 73 67 65 74 5F 73 68 6F 72 74 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 397, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 400, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 404, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_short/d/T_sget_short_4;"
+    // parsed: offset 409, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 410, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 411, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 412, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 413, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 414, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 415, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 416, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 419, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 421, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 422, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 423, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 425, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 409 (0x000199)
+        00 20 00 00 01 00 00 00 99 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d
new file mode 100644
index 0000000..b7c451a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_5.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_5
+.super java/lang/Object
+
+.field public i1 S
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const v2, 77
+       iput-short v2, v3, dot.junit.opcodes.sget_short.d.T_sget_short_5.i1 S
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_5.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java
new file mode 100644
index 0000000..c1dda0c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_5 {
+
+    public short i1 = 32000;
+    public short run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d
new file mode 100644
index 0000000..ce1ec34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_6.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.TestStubs.TestStubField S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java
new file mode 100644
index 0000000..1499a3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_6 {
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d
new file mode 100644
index 0000000..2c82957
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_7.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_7no_class.i1 S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java
new file mode 100644
index 0000000..823e90d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_7 {
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d
new file mode 100644
index 0000000..645aa56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_short_8.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.T_sget_short_8.i1N S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java
new file mode 100644
index 0000000..2c3ec32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_8 {
+    public short run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d
new file mode 100644
index 0000000..85d6755
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_short.d.StubInitError
+.super java/lang/Object
+
+.field public static value S
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 1
+       div-int/2addr v1, v0
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sget_short.d.StubInitError.value S
+       return-void
+.end method
+
+
+.source T_sget_short_9.java
+.class public dot.junit.opcodes.sget_short.d.T_sget_short_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()S
+.limit regs 3
+
+       sget-short v1, dot.junit.opcodes.sget_short.d.StubInitError.value S
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java
new file mode 100644
index 0000000..512ef4c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_short.d;
+
+public class T_sget_short_9 {
+    
+    public short run(){
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/TestStubs.java
new file mode 100644
index 0000000..3538a38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/TestStubs.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide;
+
+public class TestStubs {
+    // used by testVFE4
+    private static long TestStubField = 50;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java
new file mode 100644
index 0000000..8ecbeb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_1;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_11;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_12;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_13;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_2;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_5;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_6;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_7;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_8;
+import dot.junit.opcodes.sget_wide.d.T_sget_wide_9;
+
+public class Test_sget_wide extends DxTestCase {
+
+    /**
+     * @title type - long
+     */
+    public void testN1() {
+        T_sget_wide_1 t = new T_sget_wide_1();
+        assertEquals(12345679890123l, t.run());
+    }
+
+    /**
+     * @title type - double
+     */
+    public void testN2() {
+        T_sget_wide_2 t = new T_sget_wide_2();
+        assertEquals(123.0, t.run());
+    }
+
+    /**
+     * @title access protected field from subclass
+     */
+    public void testN3() {
+        //@uses dot.junit.opcodes.sget_wide.d.T_sget_wide_1
+        //@uses dot.junit.opcodes.sget_wide.d.T_sget_wide_11
+        T_sget_wide_11 t = new T_sget_wide_11();
+        assertEquals(10, t.run());
+    }
+
+    /**
+     * @constraint A12
+     * @title attempt to access non-static field
+     */
+    public void testE1() {
+
+        T_sget_wide_5 t = new T_sget_wide_5();
+        try {
+            t.run();
+            fail("expected IncompatibleClassChangeError");
+        } catch (IncompatibleClassChangeError e) {
+            // expected
+        }
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+
+        T_sget_wide_9 t = new T_sget_wide_9();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title read long from integer field - only field with same name but
+     * different type exists
+     */
+    public void testVFE3() {
+        try {
+            new T_sget_wide_13().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read inaccessible field.
+     */
+    public void testVFE4() {
+        //@uses dot.junit.opcodes.sget_wide.d.T_sget_wide_6
+        //@uses dot.junit.opcodes.sget_wide.TestStubs
+        try {
+            new T_sget_wide_6().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read field of undefined class.
+     */
+    public void testVFE5() {
+        try {
+            new T_sget_wide_7().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read undefined field.
+     */
+    public void testVFE6() {
+        try {
+            new T_sget_wide_8().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to read superclass' private field from subclass.
+     */
+    public void testVFE7() {
+        //@uses dot.junit.opcodes.sget_wide.d.T_sget_wide_12
+        //@uses dot.junit.opcodes.sget_wide.d.T_sget_wide_1
+        try {
+            new T_sget_wide_12().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sget-wide shall not work for reference fields
+     */
+    public void testVFE8() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for short fields
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_15");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for boolean fields
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_16");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for char fields
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_17");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for byte fields
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for float fields
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_19");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sget-wide shall not work for int fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sget_wide.d.T_sget_wide_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d
new file mode 100644
index 0000000..ffd5cb4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d
@@ -0,0 +1,51 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_1.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_1
+.super java/lang/Object
+
+.field public static i1 J
+.field protected static p1 J
+.field private static pvt1 J
+
+.method static <clinit>()V
+.limit regs 2
+       const-wide v0, 12345679890123
+       sput-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.i1 J
+
+       const-wide v0, 10
+       sput-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.p1 J
+
+       const-wide v0, 20
+       sput-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.pvt1 J
+
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java
new file mode 100644
index 0000000..e995709
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_1 {
+    public static long i1 = 12345679890123l;
+    protected static long p1 = 10;
+    private static long pvt1 = 20;
+    
+    public long run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d
new file mode 100644
index 0000000..3485b03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_11.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_11
+.super dot/junit/opcodes/sget_wide/d/T_sget_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_wide/d/T_sget_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.p1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java
new file mode 100644
index 0000000..41f07c7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_11 extends T_sget_wide_1 {
+
+    public long run(){
+        return p1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d
new file mode 100644
index 0000000..36c4678
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_12.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_12
+.super dot/junit/opcodes/sget_wide/d/T_sget_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sget_wide/d/T_sget_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_1.pvt1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java
new file mode 100644
index 0000000..9dc55c6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_12 {
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d
new file mode 100644
index 0000000..308bdd1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_13.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_13
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_13.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java
new file mode 100644
index 0000000..21fc969
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_13 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d
new file mode 100644
index 0000000..6e32d54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_14.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_14
+.super java/lang/Object
+
+.field public static i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_14.i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d
new file mode 100644
index 0000000..685bf22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_15.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_15
+.super java/lang/Object
+
+.field public static i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_15.i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d
new file mode 100644
index 0000000..5548cdc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_16.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_16
+.super java/lang/Object
+
+.field public static i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_16.i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d
new file mode 100644
index 0000000..961c845
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_17.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_17
+.super java/lang/Object
+
+.field public static i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_17.i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d
new file mode 100644
index 0000000..8dba06c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_18.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_18
+.super java/lang/Object
+
+.field public static i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_18.i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d
new file mode 100644
index 0000000..e8d5722
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_19.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_19
+.super java/lang/Object
+
+.field public static i1 F
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_19.i1 F
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d
new file mode 100644
index 0000000..4e12946
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_2.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_2
+.super java/lang/Object
+
+.field public static val D
+
+.method static <clinit>()V
+.limit regs 2
+       const-wide v0, 123.0
+       sput-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_2.val D
+       return-void
+.end method
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()D
+.limit regs 4
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_2.val D
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java
new file mode 100644
index 0000000..ea40542
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_2 {
+
+    public static double val = 123.0d;
+    
+    public double run() {
+        return val;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d
new file mode 100644
index 0000000..1861a25
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_20.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_20
+.super java/lang/Object
+
+.field public static i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_20.i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d
new file mode 100644
index 0000000..e672291
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_3.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_3
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sget-wide v3, dot.junit.opcodes.sget_wide.d.T_sget_wide_3.i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d
new file mode 100644
index 0000000..9924345
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_4.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_4
+.super java/lang/Object
+
+.field public static i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_4.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh
new file mode 100644
index 0000000..aa8661b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh
@@ -0,0 +1,266 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 7da34431
+    31 44 A3 7D 
+// parsed: offset 12, len 20: signature           : 3c53...7396
+    3C 53 BF B1 B1 75 57 C6 91 52 F2 94 23 6C C3 BF 3B B4 73 96 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 192 (0x0000c0)
+    C0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 216 (0x0000d8)
+    D8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 312
+    38 01 00 00 
+// parsed: offset 108, len 4: data_off            : 248 (0x0000f8)
+    F8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 296 (0x000128) "<init>"
+    28 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 304 (0x000130) "J"
+    30 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 307 (0x000133) "Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;"
+    33 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 354 (0x000162) "Ljava/lang/Object;"
+    62 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 374 (0x000176) "T_sget_wide_4.java"
+    76 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 394 (0x00018a) "V"
+    8A 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 397 (0x00018d) "i1"
+    8D 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 401 (0x000191) "run"
+    91 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "J"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 1 (0x000001) "J"
+//     return_type_idx: 0 (0x000000) "J"
+//     parameters_off: 0 (0x000000)
+    01 00 00 00 00 00 00 00 00 00 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 6 (0x000006) "i1"
+    01 00 00 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 192, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 200, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 208, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 216, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sget_wide_4.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 406 (0x000196)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 96 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sget_wide.d.T_sget_wide_4.<init>"
+    // parsed: offset 248, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 250, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 252, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 254, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 256, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 260, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 264, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 270, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sget_wide.d.T_sget_wide_4.run"
+    // parsed: offset 272, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 274, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 276, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 278, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 280, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 284, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 288, len 4: |0000: sget-wide v1, Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;.i1:J // field@0000
+//@mod            61 01 00 00 
+            61 01 00 01
+        // parsed: offset 292, len 2: |0002: return-wide v1
+            10 01 
+    // tries: 
+    // handlers: 
+// parsed: offset 294, len 2: PADDING
+    00 00 
+// parsed: offset 296, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 304, len 3: TYPE_STRING_DATA_ITEM [1] "J"
+    01 4A 00 
+// parsed: offset 307, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 67 65 74 5F 77 69 64 65 2F 64 2F 54 5F 73 67 65 74 5F 77 69 64 65 5F 34 3B 00 
+// parsed: offset 354, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 374, len 20: TYPE_STRING_DATA_ITEM [4] "T_sget_wide_4.java"
+    12 54 5F 73 67 65 74 5F 77 69 64 65 5F 34 2E 6A 61 76 61 00 
+// parsed: offset 394, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 397, len 4: TYPE_STRING_DATA_ITEM [6] "i1"
+    02 69 31 00 
+// parsed: offset 401, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sget_wide/d/T_sget_wide_4;"
+    // parsed: offset 406, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 407, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 408, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 409, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 410, len 1: field_idx_diff: 0 (field_idx: 0 "i1")
+                00 
+            // parsed: offset 411, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 412, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 413, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 416, len 2: code_off: 248 (0x0000f8)
+                F8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 418, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 419, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 420, len 2: code_off: 272 (0x000110)
+                90 02 
+// parsed: offset 422, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        04 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 192 (0x0000c0)
+        05 00 00 00 03 00 00 00 C0 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 216 (0x0000d8)
+        06 00 00 00 01 00 00 00 D8 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 248 (0x0000f8)
+        01 20 00 00 02 00 00 00 F8 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 296 (0x000128)
+        02 20 00 00 08 00 00 00 28 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 406 (0x000196)
+        00 20 00 00 01 00 00 00 96 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d
new file mode 100644
index 0000000..e323dc0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_5.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_5
+.super java/lang/Object
+
+.field public i1 J
+
+.method public <init>()V
+.limit regs 4
+
+       invoke-direct {v3}, java/lang/Object/<init>()V
+
+       const-wide v0, 5
+       iput-wide v0, v3, dot.junit.opcodes.sget_wide.d.T_sget_wide_5.i1 J
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_5.i1 J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java
new file mode 100644
index 0000000..6021edd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_5 {
+
+    public long i1 = 5;
+    public long run(){
+        return i1;
+    }
+}
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d
new file mode 100644
index 0000000..48e59f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_6.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.TestStubs.TestStubField J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java
new file mode 100644
index 0000000..f2744cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_6 {
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d
new file mode 100644
index 0000000..b34ddd6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_7.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v0, dot.junit.opcodes.sget_wide.d.T_sget_wide_7no_class.i1 J
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java
new file mode 100644
index 0000000..e97e416
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_7 {
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d
new file mode 100644
index 0000000..d53c7dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sget_wide_8.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.T_sget_wide_8.i1N J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java
new file mode 100644
index 0000000..95b2dbb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_8 {
+    public long run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d
new file mode 100644
index 0000000..e223578
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sget_wide.d.StubInitError
+.super java/lang/Object
+
+.field public static value J
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       const-wide v0, 1    
+       sput-wide v0, dot.junit.opcodes.sget_wide.d.StubInitError.value J
+       return-void
+.end method
+
+
+.source T_sget_wide_9.java
+.class public dot.junit.opcodes.sget_wide.d.T_sget_wide_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()J
+.limit regs 3
+
+       sget-wide v1, dot.junit.opcodes.sget_wide.d.StubInitError.value J
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java
new file mode 100644
index 0000000..a19f781
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sget_wide.d;
+
+public class T_sget_wide_9 {
+    
+    public long run(){
+        return -99;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/Test_shl_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/Test_shl_int.java
new file mode 100644
index 0000000..5b5d6ee
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/Test_shl_int.java
@@ -0,0 +1,149 @@
+package dot.junit.opcodes.shl_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shl_int.d.T_shl_int_1;
+import dot.junit.opcodes.shl_int.d.T_shl_int_6;
+
+public class Test_shl_int extends DxTestCase {
+
+    /**
+     * @title 15 << 1
+     */
+    public void testN1() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(30, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 << 2
+     */
+    public void testN2() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(132, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 << 1
+     */
+    public void testN3() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(-30, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(0x80000000, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(66, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - float, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation float parameters makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shl_int_6 t = new T_shl_int_6();
+        try {
+            t.run(3.14f, 1.2f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(0xfffffffe, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shl_int_1 t = new T_shl_int_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int.d.T_shl_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int.d.T_shl_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int.d.T_shl_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int.d.T_shl_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d
new file mode 100644
index 0000000..a9e9ede
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d
@@ -0,0 +1,18 @@
+.source T_shl_int_1.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java
new file mode 100644
index 0000000..4480d75
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_int.d;
+
+public class T_shl_int_1 {
+
+    public int run(int a, int b) {
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d
new file mode 100644
index 0000000..f1955e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int v0, v7, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d
new file mode 100644
index 0000000..88fff38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d
@@ -0,0 +1,18 @@
+.source T_shl_int_3.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       shl-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d
new file mode 100644
index 0000000..2b2fd1e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d
@@ -0,0 +1,18 @@
+.source T_shl_int_4.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       shl-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d
new file mode 100644
index 0000000..1ae15e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d
@@ -0,0 +1,18 @@
+.source T_shl_int_5.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d
new file mode 100644
index 0000000..1527b6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d
@@ -0,0 +1,18 @@
+.source T_shl_int_6.java
+.class public dot.junit.opcodes.shl_int.d.T_shl_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       shl-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java
new file mode 100644
index 0000000..bb6806c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_int.d;
+
+public class T_shl_int_6 {
+
+    public int run(float a, float b) {
+        return (int)a << (int)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java
new file mode 100644
index 0000000..7774bbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java
@@ -0,0 +1,149 @@
+package dot.junit.opcodes.shl_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_1;
+import dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_6;
+
+public class Test_shl_int_2addr extends DxTestCase {
+
+    /**
+     * @title 15 << 1
+     */
+    public void testN1() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(30, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 << 2
+     */
+    public void testN2() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(132, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 << 1
+     */
+    public void testN3() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(-30, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(0x80000000, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(66, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - float, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation for float parameters makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shl_int_2addr_6 t = new T_shl_int_2addr_6();
+        try {
+            t.run(3.14f, 1.2f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(0xfffffffe, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shl_int_2addr_1 t = new T_shl_int_2addr_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d
new file mode 100644
index 0000000..380c8c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_1.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java
new file mode 100644
index 0000000..69d8de4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_int_2addr.d;
+
+public class T_shl_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d
new file mode 100644
index 0000000..bb92f80
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_2.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int/2addr v7, v8
+       return v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d
new file mode 100644
index 0000000..7785e26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_3.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       shl-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d
new file mode 100644
index 0000000..3860a02
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_4.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       shl-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d
new file mode 100644
index 0000000..affe561
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_5.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shl-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d
new file mode 100644
index 0000000..2299e9c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_shl_int_2addr_6.java
+.class public dot.junit.opcodes.shl_int_2addr.d.T_shl_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       shl-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java
new file mode 100644
index 0000000..f82be9f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_int_2addr.d;
+
+public class T_shl_int_2addr_6 {
+
+    public int run(float a, float b) {
+        return (int)a << (int)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java
new file mode 100644
index 0000000..186ddba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java
@@ -0,0 +1,153 @@
+package dot.junit.opcodes.shl_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_1;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_2;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_3;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_4;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_5;
+import dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_6;
+
+public class Test_shl_int_lit8 extends DxTestCase {
+
+    /**
+     * @title 15 << 1
+     */
+    public void testN1() {
+        T_shl_int_lit8_1 t = new T_shl_int_lit8_1();
+        assertEquals(30, t.run(15));
+    }
+
+    /**
+     * @title 33 << 2
+     */
+    public void testN2() {
+        T_shl_int_lit8_2 t = new T_shl_int_lit8_2();
+        assertEquals(132, t.run(33));
+    }
+
+    /**
+     * @title -15 << 1
+     */
+    public void testN3() {
+        T_shl_int_lit8_1 t = new T_shl_int_lit8_1();
+        assertEquals(-30, t.run(-15));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shl_int_lit8_3 t = new T_shl_int_lit8_3();
+        assertEquals(0x80000000, t.run(1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shl_int_lit8_4 t = new T_shl_int_lit8_4();
+        assertEquals(66, t.run(33));
+    }
+    
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shl_int_lit8_6 t = new T_shl_int_lit8_6();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shl_int_lit8_3 t = new T_shl_int_lit8_3();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shl_int_lit8_1 t = new T_shl_int_lit8_1();
+        assertEquals(0xfffffffe, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shl_int_lit8_1 t = new T_shl_int_lit8_1();
+        assertEquals(0, t.run(Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shl_int_lit8_5 t = new T_shl_int_lit8_5();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d
new file mode 100644
index 0000000..8230b0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_1.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java
new file mode 100644
index 0000000..31b0543
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_1 {
+    
+    public int run(int a) {
+        int b = 1;
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d
new file mode 100644
index 0000000..ebcef08
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_10.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       shl-int/lit8 v0, v5, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d
new file mode 100644
index 0000000..ab5d308
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_2.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java
new file mode 100644
index 0000000..14f04e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_2 {
+    
+    public int run(int a) {
+        int b = 2;
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d
new file mode 100644
index 0000000..b7c3c3b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_3.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java
new file mode 100644
index 0000000..7b76307
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_3 {
+    
+    public int run(int a) {
+        int b = -1;
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d
new file mode 100644
index 0000000..3416035
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_4.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, 33
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java
new file mode 100644
index 0000000..6b80a22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_4 {
+    
+    public int run(int a) {
+        int b = 33;
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d
new file mode 100644
index 0000000..bb0ebbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_5.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java
new file mode 100644
index 0000000..f170338
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_5 {
+    
+    public int run(int a) {
+        int b = 0;
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d
new file mode 100644
index 0000000..3e2b9d5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_6.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       shl-int/lit8 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java
new file mode 100644
index 0000000..e41def3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shl_int_lit8.d;
+
+public class T_shl_int_lit8_6 {
+    
+    public int run(float a) {
+        int b = 1;
+        return (int)a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d
new file mode 100644
index 0000000..c2a0301
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_7.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shl-int/lit8 v0, v8, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d
new file mode 100644
index 0000000..49062a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_8.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       shl-int/lit8 v0, v6, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d
new file mode 100644
index 0000000..9d91c49
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d
@@ -0,0 +1,18 @@
+.source T_shl_int_lit8_9.java
+.class public dot.junit.opcodes.shl_int_lit8.d.T_shl_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       shl-int/lit8 v0, v6, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/Test_shl_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/Test_shl_long.java
new file mode 100644
index 0000000..d22ba92
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/Test_shl_long.java
@@ -0,0 +1,163 @@
+package dot.junit.opcodes.shl_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shl_long.d.T_shl_long_1;
+import dot.junit.opcodes.shl_long.d.T_shl_long_7;
+
+public class Test_shl_long extends DxTestCase {
+
+    /**
+     * @title Arguments = 5000000000l, 3
+     */
+    public void testN1() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(40000000000l, t.run(5000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 5000000000l, 1
+     */
+    public void testN2() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(10000000000l, t.run(5000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -5000000000l, 1
+     */
+    public void testN3() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(-10000000000l, t.run(-5000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(0x8000000000000000l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 64.
+     */
+    public void testN5() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(130l, t.run(65l, 65));
+    }
+    
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shl_long_7 t = new T_shl_long_7();
+        try {
+            t.run(4.67d, 1);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB2() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB3() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(0xfffffffe, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB4() {
+        T_shl_long_1 t = new T_shl_long_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long.d.T_shl_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long.d.T_shl_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int & int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long.d.T_shl_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float & int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long.d.T_shl_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference & int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long.d.T_shl_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d
new file mode 100644
index 0000000..0293191
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d
@@ -0,0 +1,18 @@
+.source T_shl_long_1.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long v0, v8, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java
new file mode 100644
index 0000000..27e13ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_long.d;
+
+public class T_shl_long_1 {
+
+    public long run(long a, int b) {
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d
new file mode 100644
index 0000000..1a5fe79
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long v0, v8, v11
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d
new file mode 100644
index 0000000..0f33164
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d
@@ -0,0 +1,18 @@
+.source T_shl_long_3.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 11
+
+       shl-long v0, v7, v9
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d
new file mode 100644
index 0000000..4392e2a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d
@@ -0,0 +1,18 @@
+.source T_shl_long_4.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)J
+.limit regs 11
+
+       shl-long v0, v9, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d
new file mode 100644
index 0000000..29ad593
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d
@@ -0,0 +1,18 @@
+.source T_shl_long_5.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)J
+.limit regs 11
+
+       shl-long v0, v9, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d
new file mode 100644
index 0000000..105c0e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d
@@ -0,0 +1,18 @@
+.source T_shl_long_6.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long v0, v7, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d
new file mode 100644
index 0000000..ed9faf0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d
@@ -0,0 +1,18 @@
+.source T_shl_long_7.java
+.class public dot.junit.opcodes.shl_long.d.T_shl_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 11
+
+       shl-long v0, v8, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java
new file mode 100644
index 0000000..ecc3e1f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_long.d;
+
+public class T_shl_long_7 {
+
+    public long run(double a, int b) {
+        return (long)a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java
new file mode 100644
index 0000000..1113905
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java
@@ -0,0 +1,163 @@
+package dot.junit.opcodes.shl_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_1;
+import dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_7;
+
+public class Test_shl_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 5000000000l, 3
+     */
+    public void testN1() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(40000000000l, t.run(5000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 5000000000l, 1
+     */
+    public void testN2() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(10000000000l, t.run(5000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -5000000000l, 1
+     */
+    public void testN3() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(-10000000000l, t.run(-5000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(0x8000000000000000l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 64.
+     */
+    public void testN5() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(130l, t.run(65l, 65));
+    }
+    
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shl_long_2addr_7 t = new T_shl_long_2addr_7();
+        try {
+            t.run(4.67d, 1);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB2() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB3() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(0xfffffffe, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB4() {
+        T_shl_long_2addr_1 t = new T_shl_long_2addr_1();
+        assertEquals(0l, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d
new file mode 100644
index 0000000..b2e3bb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_1.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long/2addr v8, v10
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java
new file mode 100644
index 0000000..569531d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_long_2addr.d;
+
+public class T_shl_long_2addr_1 {
+
+    public long run(long a, int b) {
+        return a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d
new file mode 100644
index 0000000..fd4598a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_2.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long/2addr v8, v11
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d
new file mode 100644
index 0000000..41c08f5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_3.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 11
+
+       shl-long/2addr v7, v9
+       return-wide v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d
new file mode 100644
index 0000000..4c69423
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_4.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)J
+.limit regs 11
+
+       shl-long/2addr v9, v10
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d
new file mode 100644
index 0000000..bb9b45b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_5.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)J
+.limit regs 11
+
+       shl-long/2addr v9, v10
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d
new file mode 100644
index 0000000..50738c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_6.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shl-long/2addr v7, v10
+       return-wide v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d
new file mode 100644
index 0000000..42b0717
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d
@@ -0,0 +1,18 @@
+.source T_shl_long_2addr_7.java
+.class public dot.junit.opcodes.shl_long_2addr.d.T_shl_long_2addr_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 11
+
+       shl-long/2addr v8, v10
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java
new file mode 100644
index 0000000..f6978ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shl_long_2addr.d;
+
+public class T_shl_long_2addr_7 {
+
+    public long run(double a, int b) {
+        return (long)a << b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/Test_shr_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/Test_shr_int.java
new file mode 100644
index 0000000..d81d7c8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/Test_shr_int.java
@@ -0,0 +1,150 @@
+package dot.junit.opcodes.shr_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shr_int.d.T_shr_int_1;
+import dot.junit.opcodes.shr_int.d.T_shr_int_6;
+
+public class Test_shr_int extends DxTestCase {
+
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(7, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(8, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(-8, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(0, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(16, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - float, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float parameters makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shr_int_6 t = new T_shr_int_6();
+        try {
+            t.run(3.14f, 1.2f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(0xc0000000, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shr_int_1 t = new T_shr_int_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int.d.T_shr_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int.d.T_shr_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int.d.T_shr_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int.d.T_shr_int_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d
new file mode 100644
index 0000000..9eaa104
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d
@@ -0,0 +1,18 @@
+.source T_shr_int_1.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java
new file mode 100644
index 0000000..68a7062
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_int.d;
+
+public class T_shr_int_1 {
+
+    public int run(int a, int b) {
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d
new file mode 100644
index 0000000..8800018
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int v0, v6, v8
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d
new file mode 100644
index 0000000..1f0c528
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d
@@ -0,0 +1,18 @@
+.source T_shr_int_3.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       shr-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d
new file mode 100644
index 0000000..eede586
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d
@@ -0,0 +1,18 @@
+.source T_shr_int_4.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       shr-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d
new file mode 100644
index 0000000..fe57998
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d
@@ -0,0 +1,18 @@
+.source T_shr_int_5.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int v0, v5, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d
new file mode 100644
index 0000000..0323c5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d
@@ -0,0 +1,18 @@
+.source T_shr_int_6.java
+.class public dot.junit.opcodes.shr_int.d.T_shr_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       shr-int v0, v6, v7
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java
new file mode 100644
index 0000000..86804e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_int.d;
+
+public class T_shr_int_6 {
+
+    public int run(float a, float b) {
+        return (int)a >> (int)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java
new file mode 100644
index 0000000..b52cafe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java
@@ -0,0 +1,150 @@
+package dot.junit.opcodes.shr_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_1;
+import dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_6;
+
+public class Test_shr_int_2addr extends DxTestCase {
+
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(7, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(8, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(-8, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(0, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(16, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - float, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shr_int_2addr_6 t = new T_shr_int_2addr_6();
+        try {
+            t.run(3.14f, 1.2f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(0xc0000000, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shr_int_2addr_1 t = new T_shr_int_2addr_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d
new file mode 100644
index 0000000..28765b3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_1.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java
new file mode 100644
index 0000000..e00a03d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_int_2addr.d;
+
+public class T_shr_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d
new file mode 100644
index 0000000..a7bc7ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_2.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int/2addr v6, v8
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d
new file mode 100644
index 0000000..0a6ea58
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_3.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)I
+.limit regs 8
+
+       shr-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d
new file mode 100644
index 0000000..3d4d094
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_4.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)I
+.limit regs 8
+
+       shr-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d
new file mode 100644
index 0000000..4b35e2a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_5.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 8
+
+       shr-int/2addr v5, v7
+       return v5
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d
new file mode 100644
index 0000000..b563cc0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_shr_int_2addr_6.java
+.class public dot.junit.opcodes.shr_int_2addr.d.T_shr_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)I
+.limit regs 8
+
+       shr-int/2addr v6, v7
+       return v6
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java
new file mode 100644
index 0000000..f9e057f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_int_2addr.d;
+
+public class T_shr_int_2addr_6 {
+
+    public int run(float a, float b) {
+        return (int)a >> (int)b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java
new file mode 100644
index 0000000..af03cff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java
@@ -0,0 +1,152 @@
+package dot.junit.opcodes.shr_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_1;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_2;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_3;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_4;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_5;
+import dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_6;
+
+public class Test_shr_int_lit8 extends DxTestCase {
+
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_shr_int_lit8_1 t = new T_shr_int_lit8_1();
+        assertEquals(7, t.run(15));
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_shr_int_lit8_2 t = new T_shr_int_lit8_2();
+        assertEquals(8, t.run(33));
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_shr_int_lit8_1 t = new T_shr_int_lit8_1();
+        assertEquals(-8, t.run(-15));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shr_int_lit8_3 t = new T_shr_int_lit8_3();
+        assertEquals(0, t.run(1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_shr_int_lit8_4 t = new T_shr_int_lit8_4();
+        assertEquals(16, t.run(33));
+    }
+    
+    /**
+     * @title Types of arguments - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shr_int_lit8_6 t = new T_shr_int_lit8_6();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shr_int_lit8_3 t = new T_shr_int_lit8_3();
+        assertEquals(0, t.run(0));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_shr_int_lit8_1 t = new T_shr_int_lit8_1();
+        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_shr_int_lit8_1 t = new T_shr_int_lit8_1();
+        assertEquals(0xc0000000, t.run(Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_shr_int_lit8_5 t = new T_shr_int_lit8_5();
+        assertEquals(1, t.run(1));
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d
new file mode 100644
index 0000000..d34130f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_1.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java
new file mode 100644
index 0000000..b784123
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_1 {
+    
+    public int run(int a) {
+        int b = 1;
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d
new file mode 100644
index 0000000..c94aa21
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_10.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_10
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v6, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d
new file mode 100644
index 0000000..1a3b1bd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_2.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java
new file mode 100644
index 0000000..1ab910d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_2 {
+    
+    public int run(int a) {
+        int b = 2;
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d
new file mode 100644
index 0000000..002cadf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_3.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, -1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java
new file mode 100644
index 0000000..5e85115
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_3 {
+    
+    public int run(int a) {
+        int b = -1;
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d
new file mode 100644
index 0000000..3b9b507
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_4.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, 33
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java
new file mode 100644
index 0000000..cc49861
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_4 {
+    
+    public int run(int a) {
+        int b = 33;
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d
new file mode 100644
index 0000000..871040a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_5.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, 0
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java
new file mode 100644
index 0000000..b27c64b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_5 {
+    
+    public int run(int a) {
+        int b = 0;
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d
new file mode 100644
index 0000000..761a30e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_6.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 8
+
+       shr-int/lit8 v0, v7, 1
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java
new file mode 100644
index 0000000..a24bcb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java
@@ -0,0 +1,9 @@
+package dot.junit.opcodes.shr_int_lit8.d;
+
+public class T_shr_int_lit8_6 {
+    
+    public int run(float a) {
+        int b = 1;
+        return (int)a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d
new file mode 100644
index 0000000..34559e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_7.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 8
+
+       shr-int/lit8 v0, v8, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d
new file mode 100644
index 0000000..d157daf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_8.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 8
+
+       shr-int/lit8 v0, v6, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d
new file mode 100644
index 0000000..ed24326
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d
@@ -0,0 +1,18 @@
+.source T_shr_int_lit8_9.java
+.class public dot.junit.opcodes.shr_int_lit8.d.T_shr_int_lit8_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 8
+
+       shr-int/lit8 v0, v6, 2
+       return v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/Test_shr_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/Test_shr_long.java
new file mode 100644
index 0000000..66bc8b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/Test_shr_long.java
@@ -0,0 +1,162 @@
+package dot.junit.opcodes.shr_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shr_long.d.T_shr_long_1;
+import dot.junit.opcodes.shr_long.d.T_shr_long_7;
+
+public class Test_shr_long extends DxTestCase {
+
+    /**
+     * @title Arguments =  40000000000l, 3
+     */
+    public void testN1() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(5000000000l, t.run(40000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 40000000000l, 1
+     */
+    public void testN2() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(20000000000l, t.run(40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -40000000000l, 1
+     */
+    public void testN3() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(-20000000000l, t.run(-40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(0l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 64.
+     */
+    public void testN5() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(32, t.run(65l, 65));
+    }
+    
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and int makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shr_long_7 t = new T_shr_long_7();
+        try {
+            t.run(4.67d, 1);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(0l, t.run(0l, -1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB2() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(1l, t.run(1l, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB3() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB4() {
+        T_shr_long_1 t = new T_shr_long_1();
+        assertEquals(0xc000000000000000l, t.run(Long.MIN_VALUE, 1));
+    }
+
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long.d.T_shr_long_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long.d.T_shr_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long.d.T_shr_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long.d.T_shr_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long.d.T_shr_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d
new file mode 100644
index 0000000..08c82f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d
@@ -0,0 +1,18 @@
+.source T_shr_long_1.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long v0, v8, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java
new file mode 100644
index 0000000..e15d414
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_long.d;
+
+public class T_shr_long_1 {
+
+    public long run(long a, int b) {
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d
new file mode 100644
index 0000000..a87004a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long v0, v8, v11
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d
new file mode 100644
index 0000000..9c78f73
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d
@@ -0,0 +1,18 @@
+.source T_shr_long_3.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 11
+
+       shr-long v0, v7, v9
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d
new file mode 100644
index 0000000..e6691cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d
@@ -0,0 +1,18 @@
+.source T_shr_long_4.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)J
+.limit regs 11
+
+       shr-long v0, v9, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d
new file mode 100644
index 0000000..f5e4cb9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d
@@ -0,0 +1,18 @@
+.source T_shr_long_5.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)J
+.limit regs 11
+
+       shr-long v0, v9, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d
new file mode 100644
index 0000000..427d1c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d
@@ -0,0 +1,18 @@
+.source T_shr_long_6.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long v0, v7, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d
new file mode 100644
index 0000000..ad83dc8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d
@@ -0,0 +1,18 @@
+.source T_shr_long_7.java
+.class public dot.junit.opcodes.shr_long.d.T_shr_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 11
+
+       shr-long v0, v8, v10
+       return-wide v0
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java
new file mode 100644
index 0000000..ca42ea9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_long.d;
+
+public class T_shr_long_7 {
+
+    public long run(double a, int b) {
+        return (long)a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java
new file mode 100644
index 0000000..22c4530
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java
@@ -0,0 +1,163 @@
+package dot.junit.opcodes.shr_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_1;
+import dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_7;
+
+public class Test_shr_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 40000000000l, 3
+     */
+    public void testN1() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(5000000000l, t.run(40000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 40000000000l, 1
+     */
+    public void testN2() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(20000000000l, t.run(40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -40000000000l, 1
+     */
+    public void testN3() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(-20000000000l, t.run(-40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(0l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 64.
+     */
+    public void testN5() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(32, t.run(65l, 65));
+    }
+    
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this operation of double and int makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_shr_long_2addr_7 t = new T_shr_long_2addr_7();
+        try {
+            t.run(4.67d, 1);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(0l, t.run(0l, -1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB2() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(1l, t.run(1l, 0));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB3() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB4() {
+        T_shr_long_2addr_1 t = new T_shr_long_2addr_1();
+        assertEquals(0xc000000000000000l, t.run(Long.MIN_VALUE, 1));
+    }
+
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d
new file mode 100644
index 0000000..0e9c36b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_1.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long/2addr v8, v10
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java
new file mode 100644
index 0000000..1c5691e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_long_2addr.d;
+
+public class T_shr_long_2addr_1 {
+
+    public long run(long a, int b) {
+        return a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d
new file mode 100644
index 0000000..a0ebe17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_2.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long/2addr v8, v11
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d
new file mode 100644
index 0000000..c07af2f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_3.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 11
+
+       shr-long/2addr v7, v9
+       return-wide v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d
new file mode 100644
index 0000000..9db034e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_4.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)J
+.limit regs 11
+
+       shr-long/2addr v9, v10
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d
new file mode 100644
index 0000000..f1045cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_5.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FI)J
+.limit regs 11
+
+       shr-long/2addr v9, v10
+       return-wide v9
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d
new file mode 100644
index 0000000..1326e76
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_6.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 11
+
+       shr-long/2addr v7, v10
+       return-wide v7
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d
new file mode 100644
index 0000000..3b3db0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d
@@ -0,0 +1,18 @@
+.source T_shr_long_2addr_7.java
+.class public dot.junit.opcodes.shr_long_2addr.d.T_shr_long_2addr_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 11
+
+       shr-long/2addr v8, v10
+       return-wide v8
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java
new file mode 100644
index 0000000..ed3e1e8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java
@@ -0,0 +1,8 @@
+package dot.junit.opcodes.shr_long_2addr.d;
+
+public class T_shr_long_2addr_7 {
+
+    public long run(double a, int b) {
+        return (long)a >> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java
new file mode 100644
index 0000000..66f5c39
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sparse_switch.d.T_sparse_switch_1;
+import dot.junit.opcodes.sparse_switch.d.T_sparse_switch_2
+;
+
+public class Test_sparse_switch extends DxTestCase {
+
+    /**
+     * @title try different values
+     */
+    public void testN1() {
+        T_sparse_switch_1 t = new T_sparse_switch_1();
+        assertEquals(2, t.run(-1));
+
+        assertEquals(-1, t.run(9));
+        assertEquals(20, t.run(10));
+        assertEquals(-1, t.run(11));
+
+        assertEquals(-1, t.run(14));
+        assertEquals(20, t.run(15));
+        assertEquals(-1, t.run(16));
+    }
+    
+    /**
+     * @title Types of arguments - float, int. Dalvik doens't distinguish 32-bits types internally,
+     * so this operation of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN2() {
+        try {
+            T_sparse_switch_2 t = new T_sparse_switch_2();
+            t.run(-1.23f);
+        } catch(Throwable t) {
+        }
+    }
+
+    /**
+     * @title Argument = Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_sparse_switch_1 t = new T_sparse_switch_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Argument = Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_sparse_switch_1 t = new T_sparse_switch_1();
+        assertEquals(-1, t.run(Integer.MIN_VALUE));
+    }
+    
+    /**
+     * @title Argument = 0
+     */
+    public void testB3() {
+        T_sparse_switch_1 t = new T_sparse_switch_1();
+        assertEquals(-1, t.run(0));
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+
+    /**
+     * @constraint B1 
+     * @title type of argument - double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  type of argument - long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title type of argument - reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A8 
+     * @title branch target shall be inside the method
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A8
+     * @title branch target shall not be "inside" instruction
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A8
+     * @title offset to table shall be inside method
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_9");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A8
+     * @title pairs shall be sorted in ascending order
+     */
+    public void testVFE9() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A8 
+     * @title number of entries in jump table
+     */
+    public void testVFE10() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B22
+     * @title sparse-switch-data pseudo-instructions must not be reachable by control flow 
+     */
+    public void testVFE11() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_13");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A8
+     * @title table has wrong ident code 
+     */
+    public void testVFE12() {
+        try {
+            Class.forName("dot.junit.opcodes.sparse_switch.d.T_sparse_switch_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d
new file mode 100644
index 0000000..bd3aaa5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_1.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java
new file mode 100644
index 0000000..05d0ba9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch.d;
+
+public class T_sparse_switch_1 {
+
+    public int run(int i) {
+        switch (i) {
+        case -1:
+            return 2;
+        case 10:
+        case 15:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d
new file mode 100644
index 0000000..5853adb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_11.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh
new file mode 100644
index 0000000..81eac01
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : cbc95483
+    83 54 C9 CB 
+// parsed: offset 12, len 20: signature           : 4fcf...5763
+    4F CF BE 7C 4E 38 25 A2 FB 35 7F 9B C3 DF 90 D5 67 72 57 63 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_11;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 417 (0x0001a1) "Ljava/lang/Object;"
+    A1 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 437 (0x0001b5) "T_sparse_switch_11.java"
+    B5 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 462 (0x0001ce) "V"
+    CE 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 465 (0x0001d1) "run"
+    D1 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_11;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_11;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_11.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 470 (0x0001d6)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D6 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_11.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_11.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: sparse-switch v4, 00000010 //  +0x00000010
+            2C 04 10 00 00 00 
+        // parsed: offset 286, len 6: |0003: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v4
+            0F 04 
+        // parsed: offset 294, len 6: |0007: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v4
+            0F 04 
+        // parsed: offset 302, len 6: |000b: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v4
+            0F 04 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+//@mod            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 02 03 00 FF FF FF FF 0F 00 00 00 0A 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 56: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_11;"
+    36 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 31 3B 00 
+// parsed: offset 417, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 437, len 25: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_11.java"
+    17 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 31 2E 6A 61 76 61 00 
+// parsed: offset 462, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 465, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_11;"
+    // parsed: offset 470, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 471, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 472, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 473, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 474, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 475, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 478, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 480, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 481, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 482, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 470 (0x0001d6)
+        00 20 00 00 01 00 00 00 D6 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d
new file mode 100644
index 0000000..feff623
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_12.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_12
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh
new file mode 100644
index 0000000..2d9ee69
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : b034540d
+    0D 54 34 B0 
+// parsed: offset 12, len 20: signature           : 17df...83d1
+    17 DF 40 0E 7B 84 69 AA B8 A3 BF 9B 70 B0 7D 1D CF 2A 83 D1 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_12;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 417 (0x0001a1) "Ljava/lang/Object;"
+    A1 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 437 (0x0001b5) "T_sparse_switch_12.java"
+    B5 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 462 (0x0001ce) "V"
+    CE 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 465 (0x0001d1) "run"
+    D1 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_12;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_12;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_12.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 470 (0x0001d6)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D6 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_12.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_12.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: sparse-switch v4, 00000010 //  +0x00000010
+            2C 04 10 00 00 00 
+        // parsed: offset 286, len 6: |0003: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v4
+            0F 04 
+        // parsed: offset 294, len 6: |0007: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v4
+            0F 04 
+        // parsed: offset 302, len 6: |000b: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v4
+            0F 04 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+//@mod            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 02 04 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 56: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_12;"
+    36 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 32 3B 00 
+// parsed: offset 417, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 437, len 25: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_12.java"
+    17 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 32 2E 6A 61 76 61 00 
+// parsed: offset 462, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 465, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_12;"
+    // parsed: offset 470, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 471, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 472, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 473, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 474, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 475, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 478, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 480, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 481, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 482, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 470 (0x0001d6)
+        00 20 00 00 01 00 00 00 D6 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java
new file mode 100644
index 0000000..c8f40c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch.d;
+
+public class T_sparse_switch_12 {
+
+    public void run() {
+        switch (1) {
+        case -1:
+            return;
+        case 10:
+            return;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d
new file mode 100644
index 0000000..8c7814d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_13.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_13
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+      goto Label0
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+Label0:
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d
new file mode 100644
index 0000000..074c119
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_14.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_14
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+      goto Label0
+Label0:
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh
new file mode 100644
index 0000000..3f17abc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh
@@ -0,0 +1,274 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 7a9e539f
+    9F 53 9E 7A 
+// parsed: offset 12, len 20: signature           : 0e0e...6b5f
+    0E 0E E3 52 F8 B0 52 FC 24 7F 08 37 B9 F7 17 79 D1 74 6B 5F 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_14;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 417 (0x0001a1) "Ljava/lang/Object;"
+    A1 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 437 (0x0001b5) "T_sparse_switch_14.java"
+    B5 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 462 (0x0001ce) "V"
+    CE 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 465 (0x0001d1) "run"
+    D1 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_14;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_14;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_14.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 470 (0x0001d6)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D6 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_14.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_14.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 2: |0000: goto 0001 // +0x0001
+            28 01 
+        // parsed: offset 282, len 6: |0001: sparse-switch v4, 00000010 //  +0x0000000f
+            2C 04 0F 00 00 00 
+        // parsed: offset 288, len 6: |0004: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 294, len 2: |0007: return v4
+            0F 04 
+        // parsed: offset 296, len 6: |0008: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 302, len 2: |000b: return v4
+            0F 04 
+        // parsed: offset 304, len 6: |000c: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 310, len 2: |000f: return v4
+            0F 04 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+//@mod            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 05 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 56: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_14;"
+    36 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 34 3B 00 
+// parsed: offset 417, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 437, len 25: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_14.java"
+    17 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 31 34 2E 6A 61 76 61 00 
+// parsed: offset 462, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 465, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_14;"
+    // parsed: offset 470, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 471, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 472, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 473, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 474, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 475, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 478, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 480, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 481, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 482, len 2: code_off: 264 (0x000108)
+                88 02 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 470 (0x0001d6)
+        00 20 00 00 01 00 00 00 D6 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d
new file mode 100644
index 0000000..0f8b90b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d
@@ -0,0 +1,50 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_2.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 5
+
+Label3:
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java
new file mode 100644
index 0000000..e9344d1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch.d;
+
+public class T_sparse_switch_2 {
+
+    public int run(float i) {
+        switch ((int)i) {
+        case -1:
+            return 2;
+        case 10:
+        case 15:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d
new file mode 100644
index 0000000..ce82bc9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_3.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+Label3:
+       sparse-switch v5
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d
new file mode 100644
index 0000000..36f8c8b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_4.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(D)I
+.limit regs 5
+
+Label3:
+       sparse-switch v3
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d
new file mode 100644
index 0000000..dc72c30
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_5.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(J)I
+.limit regs 5
+
+Label3:
+       sparse-switch v3
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d
new file mode 100644
index 0000000..25e418f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d
@@ -0,0 +1,48 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_6.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+Label3:
+       sparse-switch v3
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d
new file mode 100644
index 0000000..67f3328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_7.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh
new file mode 100644
index 0000000..47d52d4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : ffcf536e
+    6E 53 CF FF 
+// parsed: offset 12, len 20: signature           : d1bd...dc70
+    D1 BD 9D 22 FC DA 04 F6 69 A9 22 1D 41 70 69 23 80 60 DC 70 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_7;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 416 (0x0001a0) "Ljava/lang/Object;"
+    A0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 436 (0x0001b4) "T_sparse_switch_7.java"
+    B4 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 460 (0x0001cc) "V"
+    CC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 463 (0x0001cf) "run"
+    CF 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_7;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_7;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_7.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 468 (0x0001d4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_7.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_7.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: sparse-switch v4, 00000010 //  +0x00000010
+            2C 04 10 00 00 00 
+        // parsed: offset 286, len 6: |0003: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v4
+            0F 04 
+        // parsed: offset 294, len 6: |0007: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v4
+            0F 04 
+        // parsed: offset 302, len 6: |000b: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v4
+            0F 04 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+//@mod            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 01 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_7;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 37 3B 00 
+// parsed: offset 416, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 436, len 24: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_7.java"
+    16 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 37 2E 6A 61 76 61 00 
+// parsed: offset 460, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 463, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_7;"
+    // parsed: offset 468, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 469, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 470, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 471, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 472, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 473, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 476, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 479, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 480, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 482, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 20 00 00 01 00 00 00 D4 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java
new file mode 100644
index 0000000..d7a7a59
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch.d;
+
+public class T_sparse_switch_7 {
+
+    public int run(int i) {
+        switch (i) {
+        case -1:
+            return 2;
+        case 10:
+        case 15:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d
new file mode 100644
index 0000000..ba0dae3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_8.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh
new file mode 100644
index 0000000..f65851b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 3b52538d
+    8D 53 52 3B 
+// parsed: offset 12, len 20: signature           : d117...b84c
+    D1 17 6B A9 92 35 B7 F5 59 7E 60 68 BB 65 20 12 A4 EB B8 4C 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_8;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 416 (0x0001a0) "Ljava/lang/Object;"
+    A0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 436 (0x0001b4) "T_sparse_switch_8.java"
+    B4 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 460 (0x0001cc) "V"
+    CC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 463 (0x0001cf) "run"
+    CF 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_8;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_8;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_8.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 468 (0x0001d4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_8.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_8.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: sparse-switch v4, 00000010 //  +0x00000010
+            2C 04 10 00 00 00 
+        // parsed: offset 286, len 6: |0003: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v4
+            0F 04 
+        // parsed: offset 294, len 6: |0007: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v4
+            0F 04 
+        // parsed: offset 302, len 6: |000b: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v4
+            0F 04 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+//@mod            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0C 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_8;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 38 3B 00 
+// parsed: offset 416, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 436, len 24: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_8.java"
+    16 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 38 2E 6A 61 76 61 00 
+// parsed: offset 460, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 463, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_8;"
+    // parsed: offset 468, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 469, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 470, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 471, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 472, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 473, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 476, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 479, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 480, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 482, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 20 00 00 01 00 00 00 D4 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java
new file mode 100644
index 0000000..a7176dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sparse_switch.d;
+
+public class T_sparse_switch_8 {
+
+    public int run(int i) {
+        switch (i) {
+        case -1:
+            return 2;
+        case 10:
+        case 15:
+            return 20;
+        default:
+            return -1;
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d
new file mode 100644
index 0000000..2566813
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d
@@ -0,0 +1,47 @@
+; Copyright (C) 2008 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.
+
+.source T_sparse_switch_9.java
+.class public dot.junit.opcodes.sparse_switch.d.T_sparse_switch_9
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 5
+
+       sparse-switch v4
+            -1 : Label9
+            10 : Label12
+            15 : Label12
+        sparse-switch-end
+Label6:
+       const v4, -1
+       return v4
+
+Label9:
+       const v4, 2
+       return v4
+
+Label12:
+       const v4, 20
+       return v4
+
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh
new file mode 100644
index 0000000..d5d171a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh
@@ -0,0 +1,276 @@
+// Processing 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dex'...
+// Opened 'out/classes_dasm/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : b289520e
+    0E 52 89 B2 
+// parsed: offset 12, len 20: signature           : 9f96...637f
+    9F 96 22 76 3B 40 5B 16 24 C5 DA 48 89 0B 4A 96 70 E8 63 7F 
+// parsed: offset 32, len 4: file_size           : 620
+    6C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 484 (0x0001e4)
+    E4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 2
+    02 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 208 (0x0000d0)
+    D0 00 00 00 
+// parsed: offset 104, len 4: data_size           : 380
+    7C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 240 (0x0000f0)
+    F0 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 346 (0x00015a) "<init>"
+    5A 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 354 (0x000162) "I"
+    62 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 357 (0x000165) "II"
+    65 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 361 (0x000169) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_9;"
+    69 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 416 (0x0001a0) "Ljava/lang/Object;"
+    A0 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 436 (0x0001b4) "T_sparse_switch_9.java"
+    B4 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 460 (0x0001cc) "V"
+    CC 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 463 (0x0001cf) "run"
+    CF 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 3 (0x000003) "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_9;"
+    03 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "Ljava/lang/Object;"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 6 (0x000006) "V"
+    06 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 2 (0x000002) "II"
+//     return_type_idx: 0 (0x000000) "I"
+//     parameters_off: 340 (0x000154)
+    02 00 00 00 00 00 00 00 54 01 00 00 
+// parsed: offset 172, len 12: [1] 
+//     shorty_idx: 6 (0x000006) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    06 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 184, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    01 00 01 00 00 00 00 00 
+// parsed: offset 192, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 7 (0x000007) "run"
+    01 00 00 00 07 00 00 00 
+// parsed: offset 200, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 1 (0x000001) name_idx: 0 (0x000000) "<init>"
+    02 00 01 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 208, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_9;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 5 "T_sparse_switch_9.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 468 (0x0001d4)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 D4 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_9.<init>"
+    // parsed: offset 240, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 6: |0000: invoke-direct {v1}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sparse_switch.d.T_sparse_switch_9.run"
+    // parsed: offset 264, len 2: registers_size: 5
+        05 00 
+    // parsed: offset 266, len 2: ins_size: 2
+        02 00 
+    // parsed: offset 268, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 270, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 272, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 276, len 4: insns_size: 30
+        1E 00 00 00 
+    // insns:
+        // parsed: offset 280, len 6: |0000: sparse-switch v4, 00000010 //  +0x00000010
+//@mod            2C 04 10 00 00 00 
+            2C 04 10 01 00 00 
+        // parsed: offset 286, len 6: |0003: const v4, #float nan // #0xffffffff int
+            14 04 FF FF FF FF 
+        // parsed: offset 292, len 2: |0006: return v4
+            0F 04 
+        // parsed: offset 294, len 6: |0007: const v4, #float 0.000000 // #0x00000002 int
+            14 04 02 00 00 00 
+        // parsed: offset 300, len 2: |000a: return v4
+            0F 04 
+        // parsed: offset 302, len 6: |000b: const v4, #float 0.000000 // #0x00000014 int
+            14 04 14 00 00 00 
+        // parsed: offset 308, len 2: |000e: return v4
+            0F 04 
+        // parsed: offset 310, len 2: |000f: nop // spacer
+            00 00 
+        // parsed: offset 312, len 28: |0010: sparse-switch-data (14 units)
+            00 02 03 00 FF FF FF FF 0A 00 00 00 0F 00 00 00 07 00 00 00 0B 00 00 00 0B 00 00 00 
+    // tries: 
+    // handlers: 
+// TYPE_LIST
+    // parsed: offset 340, len 4: size: 1
+        01 00 00 00 
+    // parsed: offset 344, len 2: type_item [0] type_idx: 0
+        00 00 
+// parsed: offset 346, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 354, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 357, len 4: TYPE_STRING_DATA_ITEM [2] "II"
+    02 49 49 00 
+// parsed: offset 361, len 55: TYPE_STRING_DATA_ITEM [3] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_9;"
+    35 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 61 72 73 65 5F 73 77 69 74 63 68 2F 64 2F 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 39 3B 00 
+// parsed: offset 416, len 20: TYPE_STRING_DATA_ITEM [4] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 436, len 24: TYPE_STRING_DATA_ITEM [5] "T_sparse_switch_9.java"
+    16 54 5F 73 70 61 72 73 65 5F 73 77 69 74 63 68 5F 39 2E 6A 61 76 61 00 
+// parsed: offset 460, len 3: TYPE_STRING_DATA_ITEM [6] "V"
+    01 56 00 
+// parsed: offset 463, len 5: TYPE_STRING_DATA_ITEM [7] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sparse_switch/d/T_sparse_switch_9;"
+    // parsed: offset 468, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 469, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 470, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 471, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 472, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 473, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 476, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 478, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 479, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 480, len 2: code_off: 264 (0x000108)
+                88 02 
+// parsed: offset 482, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 484, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 488, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 500, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 512, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 524, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 02 00 00 00 A0 00 00 00 
+    // parsed: offset 536, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 184 (0x0000b8)
+        05 00 00 00 03 00 00 00 B8 00 00 00 
+    // parsed: offset 548, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 208 (0x0000d0)
+        06 00 00 00 01 00 00 00 D0 00 00 00 
+    // parsed: offset 560, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 240 (0x0000f0)
+        01 20 00 00 02 00 00 00 F0 00 00 00 
+    // parsed: offset 572, len 12: [7] type: 0x1001 TYPE_TYPE_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 340 (0x000154)
+        01 10 00 00 01 00 00 00 54 01 00 00 
+    // parsed: offset 584, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 346 (0x00015a)
+        02 20 00 00 08 00 00 00 5A 01 00 00 
+    // parsed: offset 596, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 468 (0x0001d4)
+        00 20 00 00 01 00 00 00 D4 01 00 00 
+    // parsed: offset 608, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 484 (0x0001e4)
+        00 10 00 00 01 00 00 00 E4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/TestStubs.java
new file mode 100644
index 0000000..581e945
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput;
+
+public class TestStubs {
+    // used by testVFE9
+    static int TestStubField = 0;
+    
+    // used by testE5
+    public static final int TestStubFieldFinal = 0;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/Test_sput.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/Test_sput.java
new file mode 100644
index 0000000..8b73bb5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/Test_sput.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput.d.T_sput_1;
+import dot.junit.opcodes.sput.d.T_sput_10;
+import dot.junit.opcodes.sput.d.T_sput_11;
+import dot.junit.opcodes.sput.d.T_sput_12;
+import dot.junit.opcodes.sput.d.T_sput_13;
+import dot.junit.opcodes.sput.d.T_sput_14;
+import dot.junit.opcodes.sput.d.T_sput_15;
+import dot.junit.opcodes.sput.d.T_sput_17;
+import dot.junit.opcodes.sput.d.T_sput_19;
+import dot.junit.opcodes.sput.d.T_sput_5;
+import dot.junit.opcodes.sput.d.T_sput_7;
+import dot.junit.opcodes.sput.d.T_sput_8;
+import dot.junit.opcodes.sput.d.T_sput_9;
+
+
+public class Test_sput extends DxTestCase {
+
+    /**
+     * @title type - int
+     */
+    public void testN1() {
+        T_sput_1 t = new T_sput_1();
+        assertEquals(0, T_sput_1.st_i1);
+        t.run();
+        assertEquals(1000000, T_sput_1.st_i1);
+    }
+
+    /**
+     * @title type - float
+     */
+    public void testN2() {
+        T_sput_19 t = new T_sput_19();
+        assertEquals(0.0f, T_sput_19.st_f1);
+        t.run();
+        assertEquals(3.14f, T_sput_19.st_f1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN3() {
+        T_sput_12 t = new T_sput_12();
+        assertEquals(0, T_sput_12.st_i1);
+        t.run();
+        assertEquals(1000000, T_sput_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput.d.T_sput_1
+        //@uses dot.junit.opcodes.sput.d.T_sput_14
+        T_sput_14 t = new T_sput_14();
+        assertEquals(0, T_sput_14.getProtectedField());
+        t.run();
+        assertEquals(1000000, T_sput_14.getProtectedField());
+    }
+
+    /**
+     * @title Trying to put float into integer field. Dalvik doens't distinguish 32-bits types
+     * internally, so this operation makes no sense but shall not crash the VM.
+     */
+    public void testN6() {
+        T_sput_5 t = new  T_sput_5();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_13 t = new T_sput_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title  constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title  put integer into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double field
+     * with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput.TestStubs
+        //@uses dot.junit.opcodes.sput.d.T_sput_8
+        try {
+            new T_sput_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput.d.T_sput_1
+        //@uses dot.junit.opcodes.sput.d.T_sput_15
+        try {
+             new T_sput_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput shall not work for boolean fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput shall not work for byte fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput.d.T_sput_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput.TestStubs
+        //@uses dot.junit.opcodes.sput.d.T_sput_11
+    	try {
+            new T_sput_11().run();
+            fail("expected a verification exception");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.d
new file mode 100644
index 0000000..748fd1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_1.java
+.class public dot.junit.opcodes.sput.d.T_sput_1
+.super java/lang/Object
+
+.field public static st_i1 I
+.field protected static st_p1 I
+.field private static st_pvt1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()I
+.limit regs 2
+
+       sget v0, dot.junit.opcodes.sput.d.T_sput_1.st_pvt1 I
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_1.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.java
new file mode 100644
index 0000000..3bc4484
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_1 {
+    public static int st_i1;
+    protected static int st_p1;
+    private static int st_pvt1;
+    
+    public void run() {
+        st_i1 = 1000000;
+    }
+    
+    public static int getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.d
new file mode 100644
index 0000000..d753fd4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_10.java
+.class public dot.junit.opcodes.sput.d.T_sput_10
+.super java/lang/Object
+
+.field public st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_10.st_i1N I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.java
new file mode 100644
index 0000000..01a9d6b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.d
new file mode 100644
index 0000000..90cc7c0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_11.java
+.class public dot.junit.opcodes.sput.d.T_sput_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.TestStubs.TestStubFieldFinal I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.java
new file mode 100644
index 0000000..1f7ca52
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.d
new file mode 100644
index 0000000..6543443
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_12.java
+.class public dot.junit.opcodes.sput.d.T_sput_12
+.super java/lang/Object
+
+.field public static final st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_12.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.java
new file mode 100644
index 0000000..8e5f7a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_12 {
+    public static int st_i1;
+    
+    public void run() {
+        st_i1 = 1000000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.d
new file mode 100644
index 0000000..f6c9d9f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput.d.StubInitError
+.super java/lang/Object
+
+.field public static value I
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput v1, dot.junit.opcodes.sput.d.StubInitError.value I
+       return-void
+.end method
+
+
+.source T_sput_13.java
+.class public dot.junit.opcodes.sput.d.T_sput_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.StubInitError.value I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.java
new file mode 100644
index 0000000..4693899
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+class StubInitError {
+    static int value = 5 / 0; 
+}
+
+public class T_sput_13 {
+    
+    public void run() {
+        StubInitError.value = 12;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.d
new file mode 100644
index 0000000..89cab9e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_14.java
+.class public dot.junit.opcodes.sput.d.T_sput_14
+.super dot/junit/opcodes/sput/d/T_sput_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput/d/T_sput_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()I
+.limit regs 2
+
+       sget v0, dot.junit.opcodes.sput.d.T_sput_1.st_p1 I
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_1.st_p1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.java
new file mode 100644
index 0000000..102f226
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_14 extends T_sput_1{
+    
+    public void run() {
+        T_sput_1.st_p1 = 1000000;
+    }
+    
+    public static int getProtectedField(){
+        return T_sput_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.d
new file mode 100644
index 0000000..e2723fe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_15.java
+.class public dot.junit.opcodes.sput.d.T_sput_15
+.super dot/junit/opcodes/sput/d/T_sput_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput/d/T_sput_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 12321
+       sput v1, dot.junit.opcodes.sput.d.T_sput_1.st_pvt1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.java
new file mode 100644
index 0000000..25944f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_16.java
new file mode 100644
index 0000000..3360d43
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_16.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_16 {
+    public static Object o;
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.d
new file mode 100644
index 0000000..ce6a0a8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_17.java
+.class public dot.junit.opcodes.sput.d.T_sput_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_17.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.java
new file mode 100644
index 0000000..c96b5eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_18.d
new file mode 100644
index 0000000..7a79061
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_18.java
+.class public dot.junit.opcodes.sput.d.T_sput_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.d
new file mode 100644
index 0000000..d0f53cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_19.java
+.class public dot.junit.opcodes.sput.d.T_sput_19
+.super java/lang/Object
+
+.field public static st_f1 F
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+       sput v1, dot.junit.opcodes.sput.d.T_sput_19.st_f1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.java
new file mode 100644
index 0000000..854e9fd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_19.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_19 {
+    public static float st_f1;
+    
+    
+    public void run() {
+        st_f1 = 3.14f;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_2.d
new file mode 100644
index 0000000..9989c88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_2.java
+.class public dot.junit.opcodes.sput.d.T_sput_2
+.super java/lang/Object
+
+.field public static st_d1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const-wide v1, 1000000.000000
+       sput v1, dot.junit.opcodes.sput.d.T_sput_2.st_d1 D
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_20.d
new file mode 100644
index 0000000..9229d34
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_20.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_20.java
+.class public dot.junit.opcodes.sput.d.T_sput_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v3, 0
+       sput v3, dot.junit.opcodes.sput.d.T_sput_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_21.d
new file mode 100644
index 0000000..bc08d1d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_21.java
+.class public dot.junit.opcodes.sput.d.T_sput_21
+.super java/lang/Object
+
+.field public static st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1234    
+       sput v0, dot.junit.opcodes.sput.d.T_sput_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_22.d
new file mode 100644
index 0000000..ff17473
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_22.java
+.class public dot.junit.opcodes.sput.d.T_sput_22
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput v0, dot.junit.opcodes.sput.d.T_sput_22.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_23.d
new file mode 100644
index 0000000..10cdb15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_23.java
+.class public dot.junit.opcodes.sput.d.T_sput_23
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput v0, dot.junit.opcodes.sput.d.T_sput_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_24.d
new file mode 100644
index 0000000..5b6bac3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_24.java
+.class public dot.junit.opcodes.sput.d.T_sput_24
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput v0, dot.junit.opcodes.sput.d.T_sput_24.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.d
new file mode 100644
index 0000000..22aaeef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_3.java
+.class public dot.junit.opcodes.sput.d.T_sput_3
+.super java/lang/Object
+
+.field public static st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1234
+       sput v0, dot.junit.opcodes.sput.d.T_sput_3.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.dfh
new file mode 100644
index 0000000..f7d95ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput/d/T_sput_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput/d/T_sput_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 07553f66
+    66 3F 55 07 
+// parsed: offset 12, len 20: signature           : 2441...71d9
+    24 41 F7 4C E7 A3 98 B5 AC 67 0E F8 6B D1 13 E3 DD 10 71 D9 
+// parsed: offset 32, len 4: file_size           : 540
+    1C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 404 (0x000194)
+    94 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 304
+    30 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "I"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 336 (0x000150) "Ljava/lang/Object;"
+    50 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 356 (0x000164) "T_sput_3.java"
+    64 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 371 (0x000173) "V"
+    73 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 374 (0x000176) "run"
+    76 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 379 (0x00017b) "st_i1"
+    7B 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "I"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sput/d/T_sput_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 386 (0x000182)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 82 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput.d.T_sput_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput.d.T_sput_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x000004d2 int
+            14 00 D2 04 00 00 
+        // parsed: offset 282, len 4: |0003: sput v0, Ldot/junit/opcodes/sput/d/T_sput_3;.st_i1:I // field@0000
+//@mod            67 00 00 00 
+            67 00 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "I"
+    01 49 00 
+// parsed: offset 299, len 37: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    23 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 2F 64 2F 54 5F 73 70 75 74 5F 33 3B 00 
+// parsed: offset 336, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 356, len 15: TYPE_STRING_DATA_ITEM [4] "T_sput_3.java"
+    0D 54 5F 73 70 75 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 371, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 374, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 379, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput/d/T_sput_3;"
+    // parsed: offset 386, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 387, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 388, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 389, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 390, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 391, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 392, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 393, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 396, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 398, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 399, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 400, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 402, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 404, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 408, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 420, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 432, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 444, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 456, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 468, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 480, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 492, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 504, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 516, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 386 (0x000182)
+        00 20 00 00 01 00 00 00 82 01 00 00 
+    // parsed: offset 528, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 404 (0x000194)
+        00 10 00 00 01 00 00 00 94 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_4.d
new file mode 100644
index 0000000..2ca3434
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_4.java
+.class public dot.junit.opcodes.sput.d.T_sput_4
+.super java/lang/Object
+
+.field public static st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput v3, dot.junit.opcodes.sput.d.T_sput_4.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.d
new file mode 100644
index 0000000..25a88ba
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_5.java
+.class public dot.junit.opcodes.sput.d.T_sput_5
+.super java/lang/Object
+
+.field public static st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)V
+.limit regs 3
+
+       sput v2, dot.junit.opcodes.sput.d.T_sput_5.st_i1 I
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.java
new file mode 100644
index 0000000..1625283
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_5.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_5 {
+    public static int st_i1;
+    
+    public void run(float f) {
+        st_i1 = 1000000;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.d
new file mode 100644
index 0000000..7bad17d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_7.java
+.class public dot.junit.opcodes.sput.d.T_sput_7
+.super java/lang/Object
+
+.field public st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput v1, dot.junit.opcodes.sput.d.T_sput_7.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.java
new file mode 100644
index 0000000..8b22c00
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.d
new file mode 100644
index 0000000..f1b1561
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_8.java
+.class public dot.junit.opcodes.sput.d.T_sput_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput v1, dot.junit.opcodes.sput.TestStubs.TestStubField I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.java
new file mode 100644
index 0000000..5ccae38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.d
new file mode 100644
index 0000000..2e4fe0e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_9.java
+.class public dot.junit.opcodes.sput.d.T_sput_9
+.super java/lang/Object
+
+.field public st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput v1, dot.junit.opcodes.sput.d.T_sput_9noclass.st_i1 I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.java
new file mode 100644
index 0000000..b8f71e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput/d/T_sput_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput.d;
+
+public class T_sput_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/TestStubs.java
new file mode 100644
index 0000000..c6bbc0b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean;
+
+public class TestStubs {
+    // used by testVFE9
+    static boolean TestStubField = false;
+    
+    // used by testE5
+    public static final boolean TestStubFieldFinal = false;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
new file mode 100644
index 0000000..f503ec6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_10;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_11;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_12;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_13;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_14;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_15;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_17;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_7;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_8;
+import dot.junit.opcodes.sput_boolean.d.T_sput_boolean_9;
+
+
+public class Test_sput_boolean extends DxTestCase {
+
+    /**
+     * @title put boolean into static field
+     */
+    public void testN1() {
+        T_sput_boolean_1 t = new T_sput_boolean_1();
+        assertEquals(false, T_sput_boolean_1.st_i1);
+        t.run();
+        assertEquals(true, T_sput_boolean_1.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_sput_boolean_12 t = new T_sput_boolean_12();
+        assertEquals(false, T_sput_boolean_12.st_i1);
+        t.run();
+        assertEquals(true, T_sput_boolean_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_14
+        T_sput_boolean_14 t = new T_sput_boolean_14();
+        assertEquals(false, T_sput_boolean_14.getProtectedField());
+        t.run();
+        assertEquals(true, T_sput_boolean_14.getProtectedField());
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_boolean_13 t = new T_sput_boolean_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put boolean into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_boolean_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title put value '2' into boolean field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_boolean_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_boolean.TestStubs
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_8
+        try {
+            new T_sput_boolean_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_boolean_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_boolean_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_15
+        try {
+            new T_sput_boolean_15().run();
+            fail("expected a verification exception");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput_boolean shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput_boolean shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput_boolean shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput_boolean shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput_boolean shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput_boolean shall not work for byte fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title Modification of final field in other class.
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_boolean.TestStubs
+        //@uses dot.junit.opcodes.sput_boolean.d.T_sput_boolean_11
+
+    	try {
+    		new T_sput_boolean_11().run();
+    		fail("expected IllegalAccessError");
+    	} catch (IllegalAccessError t) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d
new file mode 100644
index 0000000..8078d65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_1.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1
+.super java/lang/Object
+
+.field public static st_i1 Z
+.field protected static st_p1 Z
+.field private static st_pvt1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()Z
+.limit regs 2
+
+       sget-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1.st_pvt1 Z
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1.st_i1 Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java
new file mode 100644
index 0000000..3e28038
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_1 {
+    public static boolean st_i1;
+    protected static boolean st_p1;
+    private static boolean st_pvt1;
+    
+    public void run() {
+        st_i1 = true;
+    }
+    
+    public static boolean getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d
new file mode 100644
index 0000000..672420d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_10.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_10
+.super java/lang/Object
+
+.field public st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_10.st_i1N Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java
new file mode 100644
index 0000000..1bb1f7a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d
new file mode 100644
index 0000000..796ac2a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_11.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.TestStubs.TestStubFieldFinal Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java
new file mode 100644
index 0000000..a69a474
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d
new file mode 100644
index 0000000..d6db6ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_12.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_12
+.super java/lang/Object
+
+.field public static final st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_12.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java
new file mode 100644
index 0000000..8721911
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_12 {
+    public static boolean st_i1;
+    
+    public void run() {
+        st_i1 = true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d
new file mode 100644
index 0000000..0f89bc2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput_boolean.d.StubInitError
+.super java/lang/Object
+
+.field public static value Z
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.StubInitError.value Z
+       return-void
+.end method
+
+
+.source T_sput_boolean_13.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.StubInitError.value Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java
new file mode 100644
index 0000000..20d2977
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+class StubInitError {
+    static boolean value = 5 / 0 > 0 ? true : false; 
+}
+
+public class T_sput_boolean_13 {
+    
+    public void run() {
+        StubInitError.value = true;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d
new file mode 100644
index 0000000..cbaa0e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_14.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_14
+.super dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()Z
+.limit regs 2
+
+       sget-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1.st_p1 Z
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1.st_p1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java
new file mode 100644
index 0000000..376f60f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_14 extends T_sput_boolean_1{
+    
+    public void run() {
+        T_sput_boolean_1.st_p1 = true;
+    }
+    
+    public static boolean getProtectedField(){
+        return T_sput_boolean_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d
new file mode 100644
index 0000000..4adc0ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_15.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_15
+.super dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_1.st_pvt1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java
new file mode 100644
index 0000000..467fc55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d
new file mode 100644
index 0000000..53dbe8f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_17.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_17.st_i1 Z
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java
new file mode 100644
index 0000000..5e126b5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d
new file mode 100644
index 0000000..080e547
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_18.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d
new file mode 100644
index 0000000..f7922af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_19.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_19
+.super java/lang/Object
+
+.field public static st_f1 F
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 3.14
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_19.st_f1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java
new file mode 100644
index 0000000..1cf93cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_19 {
+    public static float st_f1;
+    
+    
+    public void run() {
+        st_f1 = 3.14f;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d
new file mode 100644
index 0000000..9e6fe7f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_2.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_2
+.super java/lang/Object
+
+.field public static st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_4.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d
new file mode 100644
index 0000000..abc0227
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_20.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const v3, 0    
+       sput-boolean v3, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d
new file mode 100644
index 0000000..b1e5f5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_21.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_21
+.super java/lang/Object
+
+.field public static st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d
new file mode 100644
index 0000000..e13f364
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_22.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_22
+.super java/lang/Object
+
+.field public static st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d
new file mode 100644
index 0000000..9a5ae68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_23.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_23
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d
new file mode 100644
index 0000000..3fe5b45
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_24.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_24
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_24.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d
new file mode 100644
index 0000000..874c5f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_3.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_3
+.super java/lang/Object
+
+.field public static st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       sput-boolean v0, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_3.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh
new file mode 100644
index 0000000..db54511
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : e7454821
+    21 48 45 E7 
+// parsed: offset 12, len 20: signature           : 6104...6e2c
+    61 04 5D 28 79 FC E7 CF 89 5A 03 2C 25 BC 80 A4 F5 A3 6E 2C 
+// parsed: offset 32, len 4: file_size           : 564
+    34 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 428 (0x0001ac)
+    AC 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 328
+    48 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 349 (0x00015d) "Ljava/lang/Object;"
+    5D 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 369 (0x000171) "T_sput_boolean_3.java"
+    71 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 392 (0x000188) "V"
+    88 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 395 (0x00018b) "Z"
+    8B 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 398 (0x00018e) "run"
+    8E 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 403 (0x000193) "st_i1"
+    93 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "Z"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  type_idx: 3 (0x000003) name_idx: 7 (0x000007) "st_i1"
+    00 00 03 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    00 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_sput_boolean_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 410 (0x00019a)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 9A 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_boolean.d.T_sput_boolean_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_boolean.d.T_sput_boolean_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: sput-boolean v0, Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;.st_i1:Z // field@0000
+//@mod            6A 00 00 00 
+            6A 00 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 53: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;"
+    33 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 62 6F 6F 6C 65 61 6E 2F 64 2F 54 5F 73 70 75 74 5F 62 6F 6F 6C 65 61 6E 5F 33 3B 00 
+// parsed: offset 349, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 369, len 23: TYPE_STRING_DATA_ITEM [3] "T_sput_boolean_3.java"
+    15 54 5F 73 70 75 74 5F 62 6F 6F 6C 65 61 6E 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 392, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 395, len 3: TYPE_STRING_DATA_ITEM [5] "Z"
+    01 5A 00 
+// parsed: offset 398, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 403, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_boolean/d/T_sput_boolean_3;"
+    // parsed: offset 410, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 411, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 412, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 413, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 414, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 415, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 417, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 420, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 422, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 423, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 424, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 426, len 2: PADDING
+    00 00 
+// map_list:
+    // parsed: offset 428, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 432, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 444, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 456, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 468, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 480, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 492, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 504, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 516, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 528, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 540, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 410 (0x00019a)
+        00 20 00 00 01 00 00 00 9A 01 00 00 
+    // parsed: offset 552, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 428 (0x0001ac)
+        00 10 00 00 01 00 00 00 AC 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d
new file mode 100644
index 0000000..d0a7422
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_4.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_4
+.super java/lang/Object
+
+.field public static st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-boolean v3, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_4.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
new file mode 100644
index 0000000..d50c573
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_6.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6
+.super java/lang/Object
+
+.field public static s Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 6
+
+       const v2, 2    
+       sput-boolean v2, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6.s Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d
new file mode 100644
index 0000000..c6b97f0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_7.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_7
+.super java/lang/Object
+
+.field public st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_7.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java
new file mode 100644
index 0000000..7a97328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d
new file mode 100644
index 0000000..4b781da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_8.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.TestStubs.TestStubField Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java
new file mode 100644
index 0000000..8d738ae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d
new file mode 100644
index 0000000..6deddd6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_boolean_9.java
+.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_9
+.super java/lang/Object
+
+.field public st_i1 Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-boolean v1, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_9noclass.st_i1 Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java
new file mode 100644
index 0000000..6028d28
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_boolean.d;
+
+public class T_sput_boolean_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/TestStubs.java
new file mode 100644
index 0000000..7b530ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte;
+
+public class TestStubs {
+    // used by testVFE9
+    static byte TestStubField = 1;
+    
+    // used by testE5
+    public static final byte TestStubFieldFinal = 1;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
new file mode 100644
index 0000000..c64f876
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_1;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_10;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_11;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_12;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_13;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_14;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_15;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_17;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_7;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_8;
+import dot.junit.opcodes.sput_byte.d.T_sput_byte_9;
+
+public class Test_sput_byte extends DxTestCase {
+    /**
+     * @title put byte into static field
+     */
+    public void testN1() {
+        T_sput_byte_1 t = new T_sput_byte_1();
+        assertEquals(0, T_sput_byte_1.st_i1);
+        t.run();
+        assertEquals(77, T_sput_byte_1.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_sput_byte_12 t = new T_sput_byte_12();
+        assertEquals(0, T_sput_byte_12.st_i1);
+        t.run();
+        assertEquals(77, T_sput_byte_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_1
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_14
+        T_sput_byte_14 t = new T_sput_byte_14();
+        assertEquals(0, T_sput_byte_14.getProtectedField());
+        t.run();
+        assertEquals(77, T_sput_byte_14.getProtectedField());
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_byte_13 t = new T_sput_byte_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put byte into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_byte_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title put value '256' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_byte_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_byte.TestStubs
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_8
+        try {
+            new T_sput_byte_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_byte_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_byte_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_1
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_15
+        try {
+            new T_sput_byte_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput-byte shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-byte shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-byte shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-byte shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-byte shall not work for char fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1
+     * @title sput-byte shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_byte.TestStubs
+        //@uses dot.junit.opcodes.sput_byte.d.T_sput_byte_11
+    	try {
+            new T_sput_byte_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d
new file mode 100644
index 0000000..ec9b61c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_1.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_1
+.super java/lang/Object
+
+.field public static st_i1 B
+.field protected static st_p1 B
+.field private static st_pvt1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()B
+.limit regs 2
+
+       sget-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_1.st_pvt1 B
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_1.st_i1 B
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java
new file mode 100644
index 0000000..56c52c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_1 {
+    public static byte st_i1;
+    protected static byte st_p1;
+    private static byte st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public static byte getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d
new file mode 100644
index 0000000..f0a420c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_10.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_10
+.super java/lang/Object
+
+.field public st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_10.st_i1N B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java
new file mode 100644
index 0000000..0b49e2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d
new file mode 100644
index 0000000..7a3faff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_11.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.TestStubs.TestStubFieldFinal B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java
new file mode 100644
index 0000000..1cf3e6c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d
new file mode 100644
index 0000000..41e2aff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_12.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_12
+.super java/lang/Object
+
+.field public static final st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_12.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java
new file mode 100644
index 0000000..4e438a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_12 {
+    public static byte st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d
new file mode 100644
index 0000000..2271ca2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput_byte.d.StubInitError
+.super java/lang/Object
+
+.field public static value B
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.StubInitError.value B
+       return-void
+.end method
+
+
+.source T_sput_byte_13.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.StubInitError.value B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java
new file mode 100644
index 0000000..5270328
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+class StubInitError {
+    static byte value = (byte)(5 / 0); 
+}
+
+public class T_sput_byte_13 {
+    
+    public void run() {
+        StubInitError.value = 11;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d
new file mode 100644
index 0000000..1b216a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_14.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_14
+.super dot/junit/opcodes/sput_byte/d/T_sput_byte_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_byte/d/T_sput_byte_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()B
+.limit regs 2
+
+       sget-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_1.st_p1 B
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_1.st_p1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java
new file mode 100644
index 0000000..67075e7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_14 extends T_sput_byte_1{
+    
+    public void run() {
+        T_sput_byte_1.st_p1 = 77;
+    }
+    
+    public static byte getProtectedField(){
+        return T_sput_byte_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d
new file mode 100644
index 0000000..8fd5828
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_15.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_15
+.super dot/junit/opcodes/sput_byte/d/T_sput_byte_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_byte/d/T_sput_byte_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_1.st_pvt1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java
new file mode 100644
index 0000000..c797268
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d
new file mode 100644
index 0000000..76bd507
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_17.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_17.st_i1 B
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java
new file mode 100644
index 0000000..4ee32fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d
new file mode 100644
index 0000000..159ef4d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_18.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d
new file mode 100644
index 0000000..c9520be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_2.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_2
+.super java/lang/Object
+
+.field public static st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_4.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d
new file mode 100644
index 0000000..9a77ec6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_20.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-byte v3, dot.junit.opcodes.sput_byte.d.T_sput_byte_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
new file mode 100644
index 0000000..15a924b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_21.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_21
+.super java/lang/Object
+
+.field public static st_s I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_21.st_s I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
new file mode 100644
index 0000000..3501490
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_22.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_22
+.super java/lang/Object
+
+.field public static st_b I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_22.st_b I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d
new file mode 100644
index 0000000..a34f665
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_23.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_23
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_23.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d
new file mode 100644
index 0000000..07265af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_24.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_24
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d
new file mode 100644
index 0000000..128d14b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_3.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_3
+.super java/lang/Object
+
+.field public static st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_3.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh
new file mode 100644
index 0000000..86678ff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : e05a4586
+    86 45 5A E0 
+// parsed: offset 12, len 20: signature           : 90cf...df87
+    90 CF A4 6E C3 FD 39 4D 4D 5C E0 CB 09 2E 87 21 CC F6 DF 87 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "B"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 346 (0x00015a) "Ljava/lang/Object;"
+    5A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 366 (0x00016e) "T_sput_byte_3.java"
+    6E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 386 (0x000182) "V"
+    82 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "run"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 394 (0x00018a) "st_i1"
+    8A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "B"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_byte_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 401 (0x000191)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 91 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_byte.d.T_sput_byte_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_byte.d.T_sput_byte_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: sput-byte v0, Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;.st_i1:B // field@0000
+//@mod            6B 00 00 00 
+            6B 00 00 01
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "B"
+    01 42 00 
+// parsed: offset 299, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 62 79 74 65 2F 64 2F 54 5F 73 70 75 74 5F 62 79 74 65 5F 33 3B 00 
+// parsed: offset 346, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [4] "T_sput_byte_3.java"
+    12 54 5F 73 70 75 74 5F 62 79 74 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 386, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 389, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 394, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_byte/d/T_sput_byte_3;"
+    // parsed: offset 401, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 402, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 403, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 404, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 405, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 406, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 408, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 411, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 413, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 414, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 415, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 417, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 401 (0x000191)
+        00 20 00 00 01 00 00 00 91 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d
new file mode 100644
index 0000000..fc64b62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_4.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_4
+.super java/lang/Object
+
+.field public static st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-byte v3, dot.junit.opcodes.sput_byte.d.T_sput_byte_4.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
new file mode 100644
index 0000000..f41929a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_6.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_6
+.super java/lang/Object
+
+.field public static st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 256
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_6.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d
new file mode 100644
index 0000000..8e90c22
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_7.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_7
+.super java/lang/Object
+
+.field public st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_7.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java
new file mode 100644
index 0000000..8871136
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d
new file mode 100644
index 0000000..f4a000f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_8.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-byte v1, dot.junit.opcodes.sput_byte.TestStubs.TestStubField B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java
new file mode 100644
index 0000000..0e1605f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d
new file mode 100644
index 0000000..59ecb38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_byte_9.java
+.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_9
+.super java/lang/Object
+
+.field public st_i1 B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-byte v1, dot.junit.opcodes.sput_byte.d.T_sput_byte_9noclass.st_i1 B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java
new file mode 100644
index 0000000..0262d88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_byte.d;
+
+public class T_sput_byte_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/TestStubs.java
new file mode 100644
index 0000000..fb91f68
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char;
+
+public class TestStubs {
+    // used by testVFE9
+    static char TestStubField = 1;
+    
+    // used by testE5
+    public static final char TestStubFieldFinal = 1;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java
new file mode 100644
index 0000000..120b45a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_char.d.T_sput_char_1;
+import dot.junit.opcodes.sput_char.d.T_sput_char_10;
+import dot.junit.opcodes.sput_char.d.T_sput_char_11;
+import dot.junit.opcodes.sput_char.d.T_sput_char_12;
+import dot.junit.opcodes.sput_char.d.T_sput_char_13;
+import dot.junit.opcodes.sput_char.d.T_sput_char_14;
+import dot.junit.opcodes.sput_char.d.T_sput_char_15;
+import dot.junit.opcodes.sput_char.d.T_sput_char_17;
+import dot.junit.opcodes.sput_char.d.T_sput_char_7;
+import dot.junit.opcodes.sput_char.d.T_sput_char_8;
+import dot.junit.opcodes.sput_char.d.T_sput_char_9;
+
+public class Test_sput_char extends DxTestCase {
+    /**
+     * @title put char into static field
+     */
+    public void testN1() {
+        T_sput_char_1 t = new T_sput_char_1();
+        assertEquals(0, T_sput_char_1.st_i1);
+        t.run();
+        assertEquals(77, T_sput_char_1.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_sput_char_12 t = new T_sput_char_12();
+        assertEquals(0, T_sput_char_12.st_i1);
+        t.run();
+        assertEquals(77, T_sput_char_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_1
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_14
+        T_sput_char_14 t = new T_sput_char_14();
+        assertEquals(0, T_sput_char_14.getProtectedField());
+        t.run();
+        assertEquals(77, T_sput_char_14.getProtectedField());
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_char_13 t = new T_sput_char_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put char into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_char_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title put value '66000' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_char_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_char.TestStubs
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_8
+        try {
+            new T_sput_char_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_char_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_char_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_1
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_15
+        try {
+            new T_sput_char_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput-char shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-char shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-char shall not work for short fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-char shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-char shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-char shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_char.TestStubs
+        //@uses dot.junit.opcodes.sput_char.d.T_sput_char_11
+    	try {
+            new T_sput_char_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d
new file mode 100644
index 0000000..8603349
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_1.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_1
+.super java/lang/Object
+
+.field public static st_i1 C
+.field protected static st_p1 C
+.field private static st_pvt1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()C
+.limit regs 2
+
+       sget-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_1.st_pvt1 C
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_1.st_i1 C
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java
new file mode 100644
index 0000000..0437a31
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_1 {
+    public static char st_i1;
+    protected static char st_p1;
+    private static char st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public static char getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d
new file mode 100644
index 0000000..ff47c26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_10.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_10
+.super java/lang/Object
+
+.field public st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_10.st_i1N C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java
new file mode 100644
index 0000000..10f88f3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d
new file mode 100644
index 0000000..6e23f44
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_11.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.TestStubs.TestStubFieldFinal C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java
new file mode 100644
index 0000000..600cc9d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d
new file mode 100644
index 0000000..8cb984f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_12.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_12
+.super java/lang/Object
+
+.field public static final st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_12.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java
new file mode 100644
index 0000000..cd1f810
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_12 {
+    public static char st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d
new file mode 100644
index 0000000..5b97bc4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput_char.d.StubInitError
+.super java/lang/Object
+
+.field public static value C
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput-char v1, dot.junit.opcodes.sput_char.d.StubInitError.value C
+       return-void
+.end method
+
+
+.source T_sput_char_13.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.d.StubInitError.value C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java
new file mode 100644
index 0000000..786f121
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+class StubInitError {
+    static char value = (char)(5 / 0); 
+}
+
+public class T_sput_char_13 {
+    
+    public void run() {
+        StubInitError.value = 11;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d
new file mode 100644
index 0000000..f682166
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_14.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_14
+.super dot/junit/opcodes/sput_char/d/T_sput_char_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_char/d/T_sput_char_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()C
+.limit regs 2
+
+       sget-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_1.st_p1 C
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_1.st_p1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java
new file mode 100644
index 0000000..409b51c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_14 extends T_sput_char_1{
+    
+    public void run() {
+        T_sput_char_1.st_p1 = 77;
+    }
+    
+    public static char getProtectedField(){
+        return T_sput_char_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d
new file mode 100644
index 0000000..cccb96b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_15.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_15
+.super dot/junit/opcodes/sput_char/d/T_sput_char_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_char/d/T_sput_char_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_1.st_pvt1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java
new file mode 100644
index 0000000..2b4d7d2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d
new file mode 100644
index 0000000..22af6be
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_17.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_17.st_i1 C
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java
new file mode 100644
index 0000000..349eaa2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d
new file mode 100644
index 0000000..f1fbeb6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_18.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d
new file mode 100644
index 0000000..aa5f7d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_2.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_2
+.super java/lang/Object
+
+.field public static st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_4.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d
new file mode 100644
index 0000000..92d2e6e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_20.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-char v3, dot.junit.opcodes.sput_char.d.T_sput_char_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d
new file mode 100644
index 0000000..bdf6fe3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_21.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_21
+.super java/lang/Object
+
+.field public static st_s S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_21.st_s S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d
new file mode 100644
index 0000000..fa16663
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_22.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_22
+.super java/lang/Object
+
+.field public static st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d
new file mode 100644
index 0000000..fd69e4f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_23.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_23
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d
new file mode 100644
index 0000000..8862e51
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_24.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_24
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d
new file mode 100644
index 0000000..ff1725f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_3.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_3
+.super java/lang/Object
+
+.field public static st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_3.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh
new file mode 100644
index 0000000..45f6af2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_char/d/T_sput_char_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_char/d/T_sput_char_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : bc0b43dc
+    DC 43 0B BC 
+// parsed: offset 12, len 20: signature           : ade8...22aa
+    AD E8 8C 2F 92 1D 57 2F 31 A9 89 DE D2 D7 EF 3B 36 0D 22 AA 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "C"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 299 (0x00012b) "Ldot/junit/opcodes/sput_char/d/T_sput_char_3;"
+    2B 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 346 (0x00015a) "Ljava/lang/Object;"
+    5A 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 366 (0x00016e) "T_sput_char_3.java"
+    6E 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 386 (0x000182) "V"
+    82 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 389 (0x000185) "run"
+    85 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 394 (0x00018a) "st_i1"
+    8A 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "C"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sput_char/d/T_sput_char_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sput_char/d/T_sput_char_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_char_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 401 (0x000191)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 91 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_char.d.T_sput_char_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_char.d.T_sput_char_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: sput-char v0, Ldot/junit/opcodes/sput_char/d/T_sput_char_3;.st_i1:C // field@0000
+//@mod            6C 00 00 00 
+            6C 00 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 3: TYPE_STRING_DATA_ITEM [1] "C"
+    01 43 00 
+// parsed: offset 299, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sput_char/d/T_sput_char_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 63 68 61 72 2F 64 2F 54 5F 73 70 75 74 5F 63 68 61 72 5F 33 3B 00 
+// parsed: offset 346, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 366, len 20: TYPE_STRING_DATA_ITEM [4] "T_sput_char_3.java"
+    12 54 5F 73 70 75 74 5F 63 68 61 72 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 386, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 389, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 394, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_char/d/T_sput_char_3;"
+    // parsed: offset 401, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 402, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 403, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 404, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 405, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 406, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 407, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 408, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 411, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 413, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 414, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 415, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 417, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 401 (0x000191)
+        00 20 00 00 01 00 00 00 91 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d
new file mode 100644
index 0000000..95cf09b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_4.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_4
+.super java/lang/Object
+
+.field public static st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-char v3, dot.junit.opcodes.sput_char.d.T_sput_char_4.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
new file mode 100644
index 0000000..a2e504a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_6.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_6
+.super java/lang/Object
+
+.field public static st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 66000
+       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_6.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d
new file mode 100644
index 0000000..8c44574
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_7.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_7
+.super java/lang/Object
+
+.field public st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_7.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java
new file mode 100644
index 0000000..7a496f2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d
new file mode 100644
index 0000000..ac15f64
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_8.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-char v1, dot.junit.opcodes.sput_char.TestStubs.TestStubField C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java
new file mode 100644
index 0000000..c4a3e38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d
new file mode 100644
index 0000000..74279c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_char_9.java
+.class public dot.junit.opcodes.sput_char.d.T_sput_char_9
+.super java/lang/Object
+
+.field public st_i1 C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-char v1, dot.junit.opcodes.sput_char.d.T_sput_char_9noclass.st_i1 C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java
new file mode 100644
index 0000000..c38e18c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_char.d;
+
+public class T_sput_char_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/TestStubs.java
new file mode 100644
index 0000000..701ece3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object;
+
+public class TestStubs {
+    // used by testVFE9
+    static Object TestStubField = null;
+    
+    // used by testE5
+    public static final Object TestStubFieldFinal = null;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/Test_sput_object.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/Test_sput_object.java
new file mode 100644
index 0000000..cd070a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/Test_sput_object.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_object.d.T_sput_object_1;
+import dot.junit.opcodes.sput_object.d.T_sput_object_10;
+import dot.junit.opcodes.sput_object.d.T_sput_object_11;
+import dot.junit.opcodes.sput_object.d.T_sput_object_12;
+import dot.junit.opcodes.sput_object.d.T_sput_object_13;
+import dot.junit.opcodes.sput_object.d.T_sput_object_14;
+import dot.junit.opcodes.sput_object.d.T_sput_object_15;
+import dot.junit.opcodes.sput_object.d.T_sput_object_17;
+import dot.junit.opcodes.sput_object.d.T_sput_object_7;
+import dot.junit.opcodes.sput_object.d.T_sput_object_8;
+import dot.junit.opcodes.sput_object.d.T_sput_object_9;
+
+public class Test_sput_object extends DxTestCase {
+    /**
+     * @title put reference into static field
+     */
+    public void testN1() {
+        T_sput_object_1 t = new T_sput_object_1();
+        assertEquals(null, T_sput_object_1.st_i1);
+        t.run();
+        assertEquals(t, T_sput_object_1.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_sput_object_12 t = new T_sput_object_12();
+        assertEquals(null, T_sput_object_12.st_i1);
+        t.run();
+        assertEquals(t, T_sput_object_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_1
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_14
+        T_sput_object_14 t = new T_sput_object_14();
+        assertEquals(null, T_sput_object_14.getProtectedField());
+        t.run();
+        assertEquals(t, T_sput_object_14.getProtectedField());
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_object_13 t = new T_sput_object_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put object into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_object_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_object_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_object.TestStubs
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_8
+        try {
+            new T_sput_object_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_object_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_object_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_1
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_15
+        try {
+            new T_sput_object_15().run();
+            fail("expected a verification exception");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput-object shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title assignment incompatible references
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-object shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-object shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-object shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-object shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-object shall not work for short fields
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_object.d.T_sput_object_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_object.TestStubs
+        //@uses dot.junit.opcodes.sput_object.d.T_sput_object_11
+    	try {
+            new T_sput_object_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d
new file mode 100644
index 0000000..acb4903
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d
@@ -0,0 +1,45 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_1.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_1
+.super java/lang/Object
+
+.field public static st_i1 Ljava/lang/Object;
+.field protected static st_p1 Ljava/lang/Object;
+.field private static st_pvt1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()Ljava/lang/Object;
+.limit regs 2
+
+       sget-object v0, dot.junit.opcodes.sput_object.d.T_sput_object_1.st_pvt1 Ljava/lang/Object;
+       return-object v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_1.st_i1 Ljava/lang/Object;
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java
new file mode 100644
index 0000000..1bf8e5c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_1 {
+    public static Object st_i1;
+    protected static Object st_p1;
+    private static Object st_pvt1;
+    
+    public void run() {
+        st_i1 = this;
+    }
+    
+    public static Object getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d
new file mode 100644
index 0000000..7f12b99
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_10.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_10
+.super java/lang/Object
+
+.field public st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_10.st_i1N Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java
new file mode 100644
index 0000000..bbc15c5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d
new file mode 100644
index 0000000..a09c4af
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_11.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.TestStubs.TestStubFieldFinal Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java
new file mode 100644
index 0000000..7f90df0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d
new file mode 100644
index 0000000..562d8ed
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_12.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_12
+.super java/lang/Object
+
+.field public static final st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_12.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java
new file mode 100644
index 0000000..5a592c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_12 {
+    public static Object st_i1;
+    
+    public void run() {
+        st_i1 = this;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d
new file mode 100644
index 0000000..d2d59da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput_object.d.StubInitError
+.super java/lang/Object
+
+.field public static t I
+.field public static value Ljava/lang/Object;
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput v1, dot.junit.opcodes.sput_object.d.StubInitError.t I
+       return-void
+.end method
+
+
+.source T_sput_object_13.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.StubInitError.value Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java
new file mode 100644
index 0000000..9e16873
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+class StubInitError {
+    static short t = (short)(5 / 0);
+    static Object value;
+}
+
+public class T_sput_object_13 {
+    
+    public void run() {
+        StubInitError.value = this;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d
new file mode 100644
index 0000000..89ed274
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d
@@ -0,0 +1,41 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_14.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_14
+.super dot/junit/opcodes/sput_object/d/T_sput_object_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_object/d/T_sput_object_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()Ljava/lang/Object;
+.limit regs 2
+
+       sget-object v0, dot.junit.opcodes.sput_object.d.T_sput_object_1.st_p1 Ljava/lang/Object;
+       return-object v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_1.st_p1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java
new file mode 100644
index 0000000..87ea8fb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_14 extends T_sput_object_1{
+    
+    public void run() {
+        T_sput_object_1.st_p1 = this;
+    }
+    
+    public static Object getProtectedField(){
+        return T_sput_object_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d
new file mode 100644
index 0000000..61d48e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_15.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_15
+.super dot/junit/opcodes/sput_object/d/T_sput_object_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_object/d/T_sput_object_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_1.st_pvt1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java
new file mode 100644
index 0000000..676e4c3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d
new file mode 100644
index 0000000..b46acdf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_17.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_17.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java
new file mode 100644
index 0000000..6f7ad7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d
new file mode 100644
index 0000000..21c4c5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_18.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d
new file mode 100644
index 0000000..5b6c088
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_2.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_2
+.super java/lang/Object
+
+.field public static st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1234    
+       sput-object v0, dot.junit.opcodes.sput_object.d.T_sput_object_2.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d
new file mode 100644
index 0000000..8d6c9df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_20.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/String;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_20.st_o Ljava/lang/String;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d
new file mode 100644
index 0000000..f09c1a9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_21.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_21
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d
new file mode 100644
index 0000000..4ae60e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_22.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_22
+.super java/lang/Object
+
+.field public static st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d
new file mode 100644
index 0000000..b440bb4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_23.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_23
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d
new file mode 100644
index 0000000..63a01e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_24.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_24
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d
new file mode 100644
index 0000000..080efbc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_3.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_3
+.super java/lang/Object
+
+.field public static st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+        sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_3.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh
new file mode 100644
index 0000000..90b5887
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh
@@ -0,0 +1,253 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_object/d/T_sput_object_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_object/d/T_sput_object_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : c2134499
+    99 44 13 C2 
+// parsed: offset 12, len 20: signature           : ef04...607d
+    EF 04 C2 97 17 79 3D 72 CF 34 E1 02 0C 5F 88 73 55 DF 60 7D 
+// parsed: offset 32, len 4: file_size           : 544
+    20 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 408 (0x000198)
+    98 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 7
+    07 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 140 (0x00008c)
+    8C 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 152 (0x000098)
+    98 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 164 (0x0000a4)
+    A4 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 196 (0x0000c4)
+    C4 00 00 00 
+// parsed: offset 104, len 4: data_size           : 316
+    3C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 228 (0x0000e4)
+    E4 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 276 (0x000114) "<init>"
+    14 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 284 (0x00011c) "Ldot/junit/opcodes/sput_object/d/T_sput_object_3;"
+    1C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 335 (0x00014f) "Ljava/lang/Object;"
+    4F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 355 (0x000163) "T_sput_object_3.java"
+    63 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 377 (0x000179) "V"
+    79 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 380 (0x00017c) "run"
+    7C 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 385 (0x000181) "st_i1"
+    81 01 00 00 
+
+// type_ids:
+// parsed: offset 140, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/sput_object/d/T_sput_object_3;"
+    01 00 00 00 
+// parsed: offset 144, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 148, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 152, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 164, len 8: [0] class_idx: 0 (0x000000)  type_idx: 1 (0x000001) name_idx: 6 (0x000006) "st_i1"
+    00 00 01 00 06 00 00 00 
+
+// methods_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 180, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 188, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 196, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sput_object/d/T_sput_object_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_sput_object_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 392 (0x000188)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 88 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_object.d.T_sput_object_3.<init>"
+    // parsed: offset 228, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 230, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 232, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 234, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 236, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 240, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 244, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 250, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_object.d.T_sput_object_3.run"
+    // parsed: offset 252, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 254, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 256, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 258, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 260, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 264, len 4: insns_size: 3
+        03 00 00 00 
+    // insns:
+        // parsed: offset 268, len 4: |0000: sput-object v2, Ldot/junit/opcodes/sput_object/d/T_sput_object_3;.st_i1:Ljava/lang/Object; // field@0000
+//@mod            69 02 00 00 
+            69 02 00 01 
+        // parsed: offset 272, len 2: |0002: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 274, len 2: PADDING
+    00 00 
+// parsed: offset 276, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 284, len 51: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/sput_object/d/T_sput_object_3;"
+    31 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 6F 62 6A 65 63 74 2F 64 2F 54 5F 73 70 75 74 5F 6F 62 6A 65 63 74 5F 33 3B 00 
+// parsed: offset 335, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 355, len 22: TYPE_STRING_DATA_ITEM [3] "T_sput_object_3.java"
+    14 54 5F 73 70 75 74 5F 6F 62 6A 65 63 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 377, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 380, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// parsed: offset 385, len 7: TYPE_STRING_DATA_ITEM [6] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_object/d/T_sput_object_3;"
+    // parsed: offset 392, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 393, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 394, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 395, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 396, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 397, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 398, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 399, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 402, len 2: code_off: 228 (0x0000e4)
+                E4 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 404, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 405, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 406, len 2: code_off: 252 (0x0000fc)
+                FC 01 
+// map_list:
+    // parsed: offset 408, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 412, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 424, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 7
+    //      offset: 112 (0x000070)
+        01 00 00 00 07 00 00 00 70 00 00 00 
+    // parsed: offset 436, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 140 (0x00008c)
+        02 00 00 00 03 00 00 00 8C 00 00 00 
+    // parsed: offset 448, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 152 (0x000098)
+        03 00 00 00 01 00 00 00 98 00 00 00 
+    // parsed: offset 460, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 164 (0x0000a4)
+        04 00 00 00 01 00 00 00 A4 00 00 00 
+    // parsed: offset 472, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 172 (0x0000ac)
+        05 00 00 00 03 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 196 (0x0000c4)
+        06 00 00 00 01 00 00 00 C4 00 00 00 
+    // parsed: offset 496, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 228 (0x0000e4)
+        01 20 00 00 02 00 00 00 E4 00 00 00 
+    // parsed: offset 508, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 7
+    //      offset: 276 (0x000114)
+        02 20 00 00 07 00 00 00 14 01 00 00 
+    // parsed: offset 520, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 392 (0x000188)
+        00 20 00 00 01 00 00 00 88 01 00 00 
+    // parsed: offset 532, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 408 (0x000198)
+        00 10 00 00 01 00 00 00 98 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d
new file mode 100644
index 0000000..3a3bccd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_4.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_4
+.super java/lang/Object
+
+.field public static st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_4.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d
new file mode 100644
index 0000000..b43597a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_6.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_6
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v3, dot.junit.opcodes.sput_object.d.T_sput_object_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d
new file mode 100644
index 0000000..84988f9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_7.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_7
+.super java/lang/Object
+
+.field public st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_7.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java
new file mode 100644
index 0000000..0e5f873
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d
new file mode 100644
index 0000000..26495a1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_8.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.TestStubs.TestStubField Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java
new file mode 100644
index 0000000..d3d7408
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d
new file mode 100644
index 0000000..2d35cf1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_object_9.java
+.class public dot.junit.opcodes.sput_object.d.T_sput_object_9
+.super java/lang/Object
+
+.field public st_i1 Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-object v2, dot.junit.opcodes.sput_object.d.T_sput_object_9noclass.st_i1 Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java
new file mode 100644
index 0000000..bef9d16
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_object.d;
+
+public class T_sput_object_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/TestStubs.java
new file mode 100644
index 0000000..dd67611
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short;
+
+public class TestStubs {
+    // used by testVFE9
+    static short TestStubField = 1;
+    
+    // used by testE5
+    public static final short TestStubFieldFinal = 1;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java
new file mode 100644
index 0000000..f14c4a7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_short.d.T_sput_short_1;
+import dot.junit.opcodes.sput_short.d.T_sput_short_10;
+import dot.junit.opcodes.sput_short.d.T_sput_short_11;
+import dot.junit.opcodes.sput_short.d.T_sput_short_12;
+import dot.junit.opcodes.sput_short.d.T_sput_short_13;
+import dot.junit.opcodes.sput_short.d.T_sput_short_14;
+import dot.junit.opcodes.sput_short.d.T_sput_short_15;
+import dot.junit.opcodes.sput_short.d.T_sput_short_17;
+import dot.junit.opcodes.sput_short.d.T_sput_short_7;
+import dot.junit.opcodes.sput_short.d.T_sput_short_8;
+import dot.junit.opcodes.sput_short.d.T_sput_short_9;
+
+public class Test_sput_short extends DxTestCase {
+    /**
+     * @title put short into static field
+     */
+    public void testN1() {
+        T_sput_short_1 t = new T_sput_short_1();
+        assertEquals(0, T_sput_short_1.st_i1);
+        t.run();
+        assertEquals(77, T_sput_short_1.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN2() {
+        T_sput_short_12 t = new T_sput_short_12();
+        assertEquals(0, T_sput_short_12.st_i1);
+        t.run();
+        assertEquals(77, T_sput_short_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_1
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_14
+        T_sput_short_14 t = new T_sput_short_14();
+        assertEquals(0, T_sput_short_14.getProtectedField());
+        t.run();
+        assertEquals(77, T_sput_short_14.getProtectedField());
+    }
+
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_short_13 t = new T_sput_short_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put short into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_short_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title put value '66000' into byte field
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify double
+     * field with single-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_short_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_short.TestStubs
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_8
+        try {
+            new T_sput_short_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class.
+     */
+    public void testVFE10() {
+        try {
+            new T_sput_short_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field.
+     */
+    public void testVFE11() {
+        try {
+            new T_sput_short_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_1
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_15
+        try {
+            new T_sput_short_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput-short shall not work for wide numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-short shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-short shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-short shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-short shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-short shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_short.TestStubs
+        //@uses dot.junit.opcodes.sput_short.d.T_sput_short_11
+    	try {
+            new T_sput_short_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d
new file mode 100644
index 0000000..f41be35
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_1.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_1
+.super java/lang/Object
+
+.field public static st_i1 S
+.field protected static st_p1 S
+.field private static st_pvt1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()S
+.limit regs 2
+
+       sget-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_1.st_pvt1 S
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_1.st_i1 S
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java
new file mode 100644
index 0000000..c2d792d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_1 {
+    public static short st_i1;
+    protected static short st_p1;
+    private static short st_pvt1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+    
+    public static short getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d
new file mode 100644
index 0000000..10a12b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_10.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_10
+.super java/lang/Object
+
+.field public st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_10.st_i1N S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java
new file mode 100644
index 0000000..3af3f04
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d
new file mode 100644
index 0000000..4351376
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_11.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.TestStubs.TestStubFieldFinal S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java
new file mode 100644
index 0000000..15f6124
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d
new file mode 100644
index 0000000..a9dbbb0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_12.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_12
+.super java/lang/Object
+
+.field public static final st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_12.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java
new file mode 100644
index 0000000..f6edd67
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_12 {
+    public static short st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d
new file mode 100644
index 0000000..55d0bf5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source StubInitError.java
+.class public dot.junit.opcodes.sput_short.d.StubInitError
+.super java/lang/Object
+
+.field public static value S
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput-short v1, dot.junit.opcodes.sput_short.d.StubInitError.value S
+       return-void
+.end method
+
+
+.source T_sput_short_13.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.d.StubInitError.value S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java
new file mode 100644
index 0000000..3750c17
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+class StubInitError {
+    static short value = (short)(5 / 0); 
+}
+
+public class T_sput_short_13 {
+    
+    public void run() {
+        StubInitError.value = 11;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d
new file mode 100644
index 0000000..a836771
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_14.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_14
+.super dot/junit/opcodes/sput_short/d/T_sput_short_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_short/d/T_sput_short_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()S
+.limit regs 2
+
+       sget-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_1.st_p1 S
+       return v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 77
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_1.st_p1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java
new file mode 100644
index 0000000..2aa5061
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_14 extends T_sput_short_1{
+    
+    public void run() {
+        T_sput_short_1.st_p1 = 77;
+    }
+    
+    public static short getProtectedField(){
+        return T_sput_short_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d
new file mode 100644
index 0000000..4848a3f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_15.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_15
+.super dot/junit/opcodes/sput_short/d/T_sput_short_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_short/d/T_sput_short_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const/16 v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_1.st_pvt1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java
new file mode 100644
index 0000000..04f6a7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d
new file mode 100644
index 0000000..3aba6fb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_17.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_17
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_17.st_i1 S
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java
new file mode 100644
index 0000000..fa56416
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d
new file mode 100644
index 0000000..e1ef12c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_18.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_18
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_18.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d
new file mode 100644
index 0000000..f6c1a55
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_2.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_2
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_4.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d
new file mode 100644
index 0000000..dc42d54
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_20.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-short v3, dot.junit.opcodes.sput_short.d.T_sput_short_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d
new file mode 100644
index 0000000..a55af0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_21.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_21
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 12    
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d
new file mode 100644
index 0000000..25375e2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_22.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_22
+.super java/lang/Object
+
+.field public static st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d
new file mode 100644
index 0000000..fc437cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_23.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_23
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d
new file mode 100644
index 0000000..16b16f1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_24.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_24
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const v0, 1    
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d
new file mode 100644
index 0000000..1246f9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_3.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_3
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_3.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh
new file mode 100644
index 0000000..ac6f1b7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh
@@ -0,0 +1,259 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_short/d/T_sput_short_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_short/d/T_sput_short_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 6a84455e
+    5E 45 84 6A 
+// parsed: offset 12, len 20: signature           : 2f3c...2c3e
+    2F 3C 42 F3 69 37 32 D5 2E D5 95 0C 52 19 F8 FB EA 75 2C 3E 
+// parsed: offset 32, len 4: file_size           : 556
+    2C 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 420 (0x0001a4)
+    A4 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 320
+    40 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 288 (0x000120) "<init>"
+    20 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 296 (0x000128) "Ldot/junit/opcodes/sput_short/d/T_sput_short_3;"
+    28 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 345 (0x000159) "Ljava/lang/Object;"
+    59 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 365 (0x00016d) "S"
+    6D 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 368 (0x000170) "T_sput_short_3.java"
+    70 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 389 (0x000185) "V"
+    85 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 392 (0x000188) "run"
+    88 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 397 (0x00018d) "st_i1"
+    8D 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/opcodes/sput_short/d/T_sput_short_3;"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "S"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 0 (0x000000)  type_idx: 2 (0x000002) name_idx: 7 (0x000007) "st_i1"
+    00 00 02 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    00 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/opcodes/sput_short/d/T_sput_short_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_short_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 404 (0x000194)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 94 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_short.d.T_sput_short_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_short.d.T_sput_short_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 6
+        06 00 00 00 
+    // insns:
+        // parsed: offset 276, len 6: |0000: const v0, #float 0.000000 // #0x00000001 int
+            14 00 01 00 00 00 
+        // parsed: offset 282, len 4: |0003: sput-short v0, Ldot/junit/opcodes/sput_short/d/T_sput_short_3;.st_i1:S // field@0000
+//@mod            6D 00 00 00 
+            6D 00 00 01 
+        // parsed: offset 286, len 2: |0005: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 288, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 296, len 49: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/opcodes/sput_short/d/T_sput_short_3;"
+    2F 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 73 68 6F 72 74 2F 64 2F 54 5F 73 70 75 74 5F 73 68 6F 72 74 5F 33 3B 00 
+// parsed: offset 345, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 365, len 3: TYPE_STRING_DATA_ITEM [3] "S"
+    01 53 00 
+// parsed: offset 368, len 21: TYPE_STRING_DATA_ITEM [4] "T_sput_short_3.java"
+    13 54 5F 73 70 75 74 5F 73 68 6F 72 74 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 389, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 392, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 397, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_short/d/T_sput_short_3;"
+    // parsed: offset 404, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 405, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 406, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 407, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 408, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 409, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 410, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 411, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 414, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 416, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 417, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 418, len 2: code_off: 260 (0x000104)
+                84 02 
+// map_list:
+    // parsed: offset 420, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 424, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 436, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 448, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 460, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 472, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 484, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 496, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 508, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 520, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 288 (0x000120)
+        02 20 00 00 08 00 00 00 20 01 00 00 
+    // parsed: offset 532, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 404 (0x000194)
+        00 20 00 00 01 00 00 00 94 01 00 00 
+    // parsed: offset 544, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 420 (0x0001a4)
+        00 10 00 00 01 00 00 00 A4 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d
new file mode 100644
index 0000000..df600da
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_4.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_4
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-short v3, dot.junit.opcodes.sput_short.d.T_sput_short_4.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
new file mode 100644
index 0000000..1b3904f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_6.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_6
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 66000
+       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d
new file mode 100644
index 0000000..99d2bc6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_7.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_7
+.super java/lang/Object
+
+.field public st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_7.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java
new file mode 100644
index 0000000..cbecc44
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d
new file mode 100644
index 0000000..ce24cf8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_8.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-short v1, dot.junit.opcodes.sput_short.TestStubs.TestStubField S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java
new file mode 100644
index 0000000..852263e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d
new file mode 100644
index 0000000..d5aa82f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_short_9.java
+.class public dot.junit.opcodes.sput_short.d.T_sput_short_9
+.super java/lang/Object
+
+.field public st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 0
+       sput-short v1, dot.junit.opcodes.sput_short.d.T_sput_short_9noclass.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java
new file mode 100644
index 0000000..e950c1d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_short.d;
+
+public class T_sput_short_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/TestStubs.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/TestStubs.java
new file mode 100644
index 0000000..bc99fda
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/TestStubs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide;
+
+public class TestStubs {
+    // used by testVFE9
+    static long TestStubField = 1;
+    
+    // used by testE5
+    public static final long TestStubFieldFinal = 1;
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java
new file mode 100644
index 0000000..29ff21b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_1;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_10;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_11;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_12;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_13;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_14;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_15;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_17;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_5;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_7;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_8;
+import dot.junit.opcodes.sput_wide.d.T_sput_wide_9;
+
+public class Test_sput_wide extends DxTestCase {
+    /**
+     * @title put long into static field
+     */
+    public void testN1() {
+        T_sput_wide_1 t = new T_sput_wide_1();
+        assertEquals(0, T_sput_wide_1.st_i1);
+        t.run();
+        assertEquals(778899112233l, T_sput_wide_1.st_i1);
+    }
+
+    /**
+     * @title put double into static field
+     */
+    public void testN2() {
+        T_sput_wide_5 t = new T_sput_wide_5();
+        assertEquals(0.0d, T_sput_wide_5.st_i1);
+        t.run();
+        assertEquals(0.5d, T_sput_wide_5.st_i1);
+    }
+
+
+    /**
+     * @title modification of final field
+     */
+    public void testN3() {
+        T_sput_wide_12 t = new T_sput_wide_12();
+        assertEquals(0, T_sput_wide_12.st_i1);
+        t.run();
+        assertEquals(77, T_sput_wide_12.st_i1);
+    }
+
+    /**
+     * @title modification of protected field from subclass
+     */
+    public void testN4() {
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_1
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_14
+        T_sput_wide_14 t = new T_sput_wide_14();
+        assertEquals(0, T_sput_wide_14.getProtectedField());
+        t.run();
+        assertEquals(77, T_sput_wide_14.getProtectedField());
+    }
+
+    /**
+     * @title initialization of referenced class throws exception
+     */
+    public void testE6() {
+        T_sput_wide_13 t = new T_sput_wide_13();
+        try {
+            t.run();
+            fail("expected Error");
+        } catch (Error e) {
+            // expected
+        }
+    }
+
+    /**
+     * @constraint A12
+     * @title constant pool index
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A23
+     * @title number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     *
+     * @constraint B13
+     * @title put int into long field - only field with same name but
+     * different type exists
+     */
+    public void testVFE5() {
+        try {
+            new T_sput_wide_17().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     *
+     * @constraint B13
+     * @title type of field doesn't match opcode - attempt to modify float
+     * field with double-width register
+     */
+    public void testVFE7() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_18");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint A12
+     * @title Attempt to set non-static field.Dalvik throws IncompatibleClassChangeError when
+     * executing the code.
+     */
+    public void testVFE8() {
+         try {
+             new T_sput_wide_7().run();
+             fail("expected IncompatibleClassChangeError");
+         } catch (IncompatibleClassChangeError t) {
+         }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify inaccessible field. Dalvik throws IllegalAccessError when executing
+     * the code.
+     */
+    public void testVFE9() {
+        //@uses dot.junit.opcodes.sput_wide.TestStubs
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_8
+        try {
+            new T_sput_wide_8().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify field of undefined class. Dalvik throws NoClassDefFoundError when
+     * executing the code.
+     */
+    public void testVFE10() {
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_9
+        try {
+            new T_sput_wide_9().run();
+            fail("expected NoClassDefFoundError");
+        } catch (NoClassDefFoundError t) {
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify undefined field. Dalvik throws NoSuchFieldError when executing the
+     * code.
+     */
+    public void testVFE11() {
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_10
+        try {
+            new T_sput_wide_10().run();
+            fail("expected NoSuchFieldError");
+        } catch (NoSuchFieldError t) {
+        }
+    }
+
+
+
+    /**
+     * @constraint n/a
+     * @title Attempt to modify superclass' private field from subclass. Dalvik throws
+     * IllegalAccessError when executing the code.
+     */
+    public void testVFE12() {
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_1
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_15
+        try {
+            new T_sput_wide_15().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+    /**
+     * @constraint B1
+     * @title sput-wide shall not work for single-width numbers
+     */
+    public void testVFE13() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for reference fields
+     */
+    public void testVFE14() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_20");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for char fields
+     */
+    public void testVFE15() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_21");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for int fields
+     */
+    public void testVFE16() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_22");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for byte fields
+     */
+    public void testVFE17() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_23");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for boolean fields
+     */
+    public void testVFE18() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_24");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     *
+     * @constraint B1
+     * @title sput-wide shall not work for short fields
+     */
+    public void testVFE6() {
+        try {
+            Class.forName("dot.junit.opcodes.sput_wide.d.T_sput_wide_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint n/a
+     * @title Modification of final field in other class
+     */
+    public void testVFE19() {
+        //@uses dot.junit.opcodes.sput_wide.TestStubs
+        //@uses dot.junit.opcodes.sput_wide.d.T_sput_wide_11
+    	try {
+            new T_sput_wide_11().run();
+            fail("expected IllegalAccessError");
+        } catch (IllegalAccessError t) {
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d
new file mode 100644
index 0000000..94e2898
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d
@@ -0,0 +1,46 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_1.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_1
+.super java/lang/Object
+
+.field public static st_i1 J
+.field protected static st_p1 J
+.field private static st_pvt1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public static getPvtField()J
+.limit regs 2
+
+       sget-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_1.st_pvt1 J
+       return-wide v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 778899112233
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_1.st_i1 J
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java
new file mode 100644
index 0000000..422b3c9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_1 {
+    public static long st_i1;
+    protected static long st_p1;
+    private static long st_pvt1;
+    
+    public void run() {
+        st_i1 = 778899112233l;
+    }
+    
+    public static long getPvtField()
+    {
+        return st_pvt1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d
new file mode 100644
index 0000000..65a6012
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_10.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_10
+.super java/lang/Object
+
+.field public st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 1
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_10.st_i1N J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java
new file mode 100644
index 0000000..b275744
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_10 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d
new file mode 100644
index 0000000..7cf07a0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_11.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_11
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 1
+       sput-wide v1, dot.junit.opcodes.sput_wide.TestStubs.TestStubFieldFinal J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java
new file mode 100644
index 0000000..c458f05
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_11 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d
new file mode 100644
index 0000000..23fc53b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_12.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_12
+.super java/lang/Object
+
+.field public static final st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 77
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_12.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java
new file mode 100644
index 0000000..3f0f128
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_12 {
+    public static long st_i1;
+    
+    public void run() {
+        st_i1 = 77;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d
new file mode 100644
index 0000000..a130809
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d
@@ -0,0 +1,53 @@
+; Copyright (C) 2008 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.
+
+.source JtubInitError.java
+.class public dot.junit.opcodes.sput_wide.d.JtubInitError
+.super java/lang/Object
+
+.field public static value J
+
+.method static <clinit>()V
+.limit regs 2
+
+       const/4 v0, 0
+       const/4 v1, 5
+       div-int/2addr v1, v0
+
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.JtubInitError.value J
+       return-void
+.end method
+
+
+.source T_sput_wide_13.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_13
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 1
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.JtubInitError.value J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java
new file mode 100644
index 0000000..ab71754
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+class StubInitError {
+    static long value = (long)(5 / 0); 
+}
+
+public class T_sput_wide_13 {
+    
+    public void run() {
+        StubInitError.value = 11;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d
new file mode 100644
index 0000000..38d5ed5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d
@@ -0,0 +1,42 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_14.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_14
+.super dot/junit/opcodes/sput_wide/d/T_sput_wide_1
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_wide/d/T_sput_wide_1/<init>()V
+       return-void
+.end method
+
+.method public static getProtectedField()J
+.limit regs 2
+
+       sget-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_1.st_p1 J
+       return-wide v0
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 77
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_1.st_p1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java
new file mode 100644
index 0000000..c919ee5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_14 extends T_sput_wide_1{
+    
+    public void run() {
+        T_sput_wide_1.st_p1 = 77;
+    }
+    
+    public static long getProtectedField(){
+        return T_sput_wide_1.st_p1;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d
new file mode 100644
index 0000000..88531b4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_15.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_15
+.super dot/junit/opcodes/sput_wide/d/T_sput_wide_1
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, dot/junit/opcodes/sput_wide/d/T_sput_wide_1/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 1
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_1.st_pvt1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java
new file mode 100644
index 0000000..376cdd8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_15 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d
new file mode 100644
index 0000000..ab57cb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_17.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_17
+.super java/lang/Object
+
+.field public static st_i1 I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 1
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_17.st_i1 J
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java
new file mode 100644
index 0000000..244fa5e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_17 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d
new file mode 100644
index 0000000..463bdbd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_18.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_18
+.super java/lang/Object
+
+.field public static st_i1 F
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v1, 1.0
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_18.st_i1 F
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d
new file mode 100644
index 0000000..84b5622
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_2.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_2
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 1
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_4.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d
new file mode 100644
index 0000000..ca43933
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_20.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_20
+.super java/lang/Object
+
+.field public static st_o Ljava/lang/Object;
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       sput-wide v3, dot.junit.opcodes.sput_wide.d.T_sput_wide_20.st_o Ljava/lang/Object;
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d
new file mode 100644
index 0000000..04cf574
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_21.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_21
+.super java/lang/Object
+
+.field public static st_c C
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 12    
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_21.st_c C
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d
new file mode 100644
index 0000000..d89d3cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_22.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_22
+.super java/lang/Object
+
+.field public static st_i I
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_22.st_i I
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d
new file mode 100644
index 0000000..da254f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_23.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_23
+.super java/lang/Object
+
+.field public static st_b B
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_23.st_b B
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d
new file mode 100644
index 0000000..e663946
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_24.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_24
+.super java/lang/Object
+
+.field public static st_z Z
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+       const-wide v0, 1    
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_24.st_z Z
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d
new file mode 100644
index 0000000..344db70
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_3.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_3
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_3.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh
new file mode 100644
index 0000000..4236b7c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh
@@ -0,0 +1,261 @@
+// Processing 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dex'...
+// Opened 'dalvik-opcodes/out/classes_dasm/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 91f343d1
+    D1 43 F3 91 
+// parsed: offset 12, len 20: signature           : 659a...c933
+    65 9A 3C 32 A2 38 1F 9A AB B7 C9 11 22 6C 75 97 DF 86 C9 33 
+// parsed: offset 32, len 4: file_size           : 560
+    30 02 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 424 (0x0001a8)
+    A8 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 8
+    08 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 4
+    04 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 144 (0x000090)
+    90 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 172 (0x0000ac)
+    AC 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 180 (0x0000b4)
+    B4 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 204 (0x0000cc)
+    CC 00 00 00 
+// parsed: offset 104, len 4: data_size           : 324
+    44 01 00 00 
+// parsed: offset 108, len 4: data_off            : 236 (0x0000ec)
+    EC 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 292 (0x000124) "<init>"
+    24 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 300 (0x00012c) "J"
+    2C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 303 (0x00012f) "Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;"
+    2F 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 350 (0x00015e) "Ljava/lang/Object;"
+    5E 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 370 (0x000172) "T_sput_wide_3.java"
+    72 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 390 (0x000186) "V"
+    86 01 00 00 
+// parsed: offset 136, len 4: [6] string_data_off: 393 (0x000189) "run"
+    89 01 00 00 
+// parsed: offset 140, len 4: [7] string_data_off: 398 (0x00018e) "st_i1"
+    8E 01 00 00 
+
+// type_ids:
+// parsed: offset 144, len 4: [0] descriptor_idx: 1 (0x000001) "J"
+    01 00 00 00 
+// parsed: offset 148, len 4: [1] descriptor_idx: 2 (0x000002) "Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;"
+    02 00 00 00 
+// parsed: offset 152, len 4: [2] descriptor_idx: 3 (0x000003) "Ljava/lang/Object;"
+    03 00 00 00 
+// parsed: offset 156, len 4: [3] descriptor_idx: 5 (0x000005) "V"
+    05 00 00 00 
+
+// proto_ids:
+// parsed: offset 160, len 12: [0] 
+//     shorty_idx: 5 (0x000005) "V"
+//     return_type_idx: 3 (0x000003) "V"
+//     parameters_off: 0 (0x000000)
+    05 00 00 00 03 00 00 00 00 00 00 00 
+
+// field_ids:
+// parsed: offset 172, len 8: [0] class_idx: 1 (0x000001)  type_idx: 0 (0x000000) name_idx: 7 (0x000007) "st_i1"
+    01 00 00 00 07 00 00 00 
+
+// methods_ids:
+// parsed: offset 180, len 8: [0] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+// parsed: offset 188, len 8: [1] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 6 (0x000006) "run"
+    01 00 00 00 06 00 00 00 
+// parsed: offset 196, len 8: [2] class_idx: 2 (0x000002)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    02 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 204, len 32: Class [0]
+//     class_idx: 1 "Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 2 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 4 "T_sput_wide_3.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 405 (0x000195)
+//     static_values_off: 0 (0x000000)
+    01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 95 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.opcodes.sput_wide.d.T_sput_wide_3.<init>"
+    // parsed: offset 236, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 238, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 240, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 242, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 244, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 248, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 252, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 258, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.opcodes.sput_wide.d.T_sput_wide_3.run"
+    // parsed: offset 260, len 2: registers_size: 3
+        03 00 
+    // parsed: offset 262, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 264, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 266, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 268, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 272, len 4: insns_size: 8
+        08 00 00 00 
+    // insns:
+        // parsed: offset 276, len 10: |0000: const-wide v0, #double 0.000000 // #0x0000000000000001 long
+            18 00 01 00 00 00 00 00 00 00 
+        // parsed: offset 286, len 4: |0005: sput-wide v0, Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;.st_i1:J // field@0000
+//@mod            68 00 00 00 
+            68 00 00 01 
+        // parsed: offset 290, len 2: |0007: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 292, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 300, len 3: TYPE_STRING_DATA_ITEM [1] "J"
+    01 4A 00 
+// parsed: offset 303, len 47: TYPE_STRING_DATA_ITEM [2] "Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;"
+    2D 4C 64 6F 74 2F 6A 75 6E 69 74 2F 6F 70 63 6F 64 65 73 2F 73 70 75 74 5F 77 69 64 65 2F 64 2F 54 5F 73 70 75 74 5F 77 69 64 65 5F 33 3B 00 
+// parsed: offset 350, len 20: TYPE_STRING_DATA_ITEM [3] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 370, len 20: TYPE_STRING_DATA_ITEM [4] "T_sput_wide_3.java"
+    12 54 5F 73 70 75 74 5F 77 69 64 65 5F 33 2E 6A 61 76 61 00 
+// parsed: offset 390, len 3: TYPE_STRING_DATA_ITEM [5] "V"
+    01 56 00 
+// parsed: offset 393, len 5: TYPE_STRING_DATA_ITEM [6] "run"
+    03 72 75 6E 00 
+// parsed: offset 398, len 7: TYPE_STRING_DATA_ITEM [7] "st_i1"
+    05 73 74 5F 69 31 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/opcodes/sput_wide/d/T_sput_wide_3;"
+    // parsed: offset 405, len 1: static_fields_size: 1
+        01 
+    // parsed: offset 406, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 407, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 408, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+        // field [0]:
+            // parsed: offset 409, len 1: field_idx_diff: 0 (field_idx: 0 "st_i1")
+                00 
+            // parsed: offset 410, len 1: access_flags: 0x000009 (PUBLIC STATIC)
+                09 
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 411, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 412, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 415, len 2: code_off: 236 (0x0000ec)
+                EC 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 417, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 418, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 419, len 2: code_off: 260 (0x000104)
+                84 02 
+// parsed: offset 421, len 3: PADDING
+    00 00 00 
+// map_list:
+    // parsed: offset 424, len 4: size: 11
+        0B 00 00 00 
+    // parsed: offset 428, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 440, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 112 (0x000070)
+        01 00 00 00 08 00 00 00 70 00 00 00 
+    // parsed: offset 452, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 4
+    //      offset: 144 (0x000090)
+        02 00 00 00 04 00 00 00 90 00 00 00 
+    // parsed: offset 464, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 160 (0x0000a0)
+        03 00 00 00 01 00 00 00 A0 00 00 00 
+    // parsed: offset 476, len 12: [4] type: 0x0004 TYPE_FIELD_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 172 (0x0000ac)
+        04 00 00 00 01 00 00 00 AC 00 00 00 
+    // parsed: offset 488, len 12: [5] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 180 (0x0000b4)
+        05 00 00 00 03 00 00 00 B4 00 00 00 
+    // parsed: offset 500, len 12: [6] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 204 (0x0000cc)
+        06 00 00 00 01 00 00 00 CC 00 00 00 
+    // parsed: offset 512, len 12: [7] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 236 (0x0000ec)
+        01 20 00 00 02 00 00 00 EC 00 00 00 
+    // parsed: offset 524, len 12: [8] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 8
+    //      offset: 292 (0x000124)
+        02 20 00 00 08 00 00 00 24 01 00 00 
+    // parsed: offset 536, len 12: [9] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 405 (0x000195)
+        00 20 00 00 01 00 00 00 95 01 00 00 
+    // parsed: offset 548, len 12: [10] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 424 (0x0001a8)
+        00 10 00 00 01 00 00 00 A8 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d
new file mode 100644
index 0000000..0f29358
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_4.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_4
+.super java/lang/Object
+
+.field public static st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       sput-wide v3, dot.junit.opcodes.sput_wide.d.T_sput_wide_4.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d
new file mode 100644
index 0000000..0918986
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d
@@ -0,0 +1,38 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_5.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_5
+.super java/lang/Object
+
+.field public static st_i1 D
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 0.5
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_5.st_i1 D
+
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java
new file mode 100644
index 0000000..1147ce0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_5 {
+    public static double st_i1;
+    
+    public void run() {
+        st_i1 = 0.5d;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d
new file mode 100644
index 0000000..1552b40
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_6.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_6
+.super java/lang/Object
+
+.field public static st_i1 S
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 1
+       sput-wide v0, dot.junit.opcodes.sput_wide.d.T_sput_wide_6.st_i1 S
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d
new file mode 100644
index 0000000..726dfff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_7.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_7
+.super java/lang/Object
+
+.field public st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 0
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_7.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java
new file mode 100644
index 0000000..4608227
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_7 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d
new file mode 100644
index 0000000..f14a34c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_8.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 0
+       sput-wide v1, dot.junit.opcodes.sput_wide.TestStubs.TestStubField J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java
new file mode 100644
index 0000000..17cf144
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_8 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d
new file mode 100644
index 0000000..64f57d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sput_wide_9.java
+.class public dot.junit.opcodes.sput_wide.d.T_sput_wide_9
+.super java/lang/Object
+
+.field public st_i1 J
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v1, 0
+       sput-wide v1, dot.junit.opcodes.sput_wide.d.T_sput_wide_9noclass.st_i1 J
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java
new file mode 100644
index 0000000..00355dd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+package dot.junit.opcodes.sput_wide.d;
+
+public class T_sput_wide_9 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/Test_sub_double.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/Test_sub_double.java
new file mode 100644
index 0000000..5126c8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/Test_sub_double.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_double.d.T_sub_double_1;
+import dot.junit.opcodes.sub_double.d.T_sub_double_3;
+
+public class Test_sub_double extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(-0.43999999999999995d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(3.14d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title 
+     */
+    public void testN3() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(-0.43999999999999995d, t.run(-3.14d, -2.7d));
+    }
+    
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this subtraction of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_sub_double_3 t = new T_sub_double_3();
+        try {
+            t.run(12345l, 3.14d);
+        } catch (Throwable e) {
+        }
+    }  
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB4() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = +0, -0d
+     */
+    public void testB5() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(+0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = +0d, +0d
+     */
+    public void testB7() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(+0d, t.run(+0d, +0d));
+    }
+
+    /**
+     * @title Arguments = 2.7d, 2.7d
+     */
+    public void testB8() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(0d, t.run(2.7d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB9() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(0d, t.run(Double.MAX_VALUE, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, 4.9E-324
+     */
+    public void testB10() {
+        T_sub_double_1 t = new T_sub_double_1();
+        assertEquals(0d, t.run(Double.MIN_VALUE, 4.9E-324));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double.d.T_sub_double_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double.d.T_sub_double_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double.d.T_sub_double_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double.d.T_sub_double_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d
new file mode 100644
index 0000000..99060a2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_1.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java
new file mode 100644
index 0000000..7193f2e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double.d;
+
+public class T_sub_double_1 {
+
+    public double run(double a, double b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d
new file mode 100644
index 0000000..e202f3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       const v3, 3.1415
+       sub-double v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d
new file mode 100644
index 0000000..ac2644e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_3.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 7
+
+       sub-double v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java
new file mode 100644
index 0000000..9b8ee8e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double.d;
+
+public class T_sub_double_3 {
+
+    public double run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d
new file mode 100644
index 0000000..cf89f31
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_4.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double v0, v3, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d
new file mode 100644
index 0000000..69bbda7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_5.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double v0, v3, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d
new file mode 100644
index 0000000..6995970
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_6.java
+.class public dot.junit.opcodes.sub_double.d.T_sub_double_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 7
+       move v0, v5
+       move v1, v5
+       move v2, v6
+       move v3, v6       
+       sub-double v0, v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java
new file mode 100644
index 0000000..bdd4206
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_1;
+import dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_3;
+
+public class Test_sub_double_2addr extends DxTestCase {
+     /**
+     * @title Arguments = 2.7d, 3.14d
+     */
+    public void testN1() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(-0.43999999999999995d, t.run(2.7d, 3.14d));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14d
+     */
+    public void testN2() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(3.14d, t.run(0, -3.14d));
+    }
+
+    /**
+     * @title 
+     */
+    public void testN3() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(-0.43999999999999995d, t.run(-3.14d, -2.7d));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this subtraction of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_sub_double_2addr_3 t = new T_sub_double_2addr_3();
+        try {
+            t.run(12345l, 3.14d);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.NaN
+     */
+    public void testB1() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                Double.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY,
+     * Double.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
+                Double.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Double.POSITIVE_INFINITY, -2.7d
+     */
+    public void testB4() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
+                -2.7d));
+    }
+
+    /**
+     * @title Arguments = +0, -0d
+     */
+    public void testB5() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(+0d, t.run(+0d, -0d));
+    }
+
+    /**
+     * @title Arguments = -0d, -0d
+     */
+    public void testB6() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(0d, t.run(-0d, -0d));
+    }
+
+    /**
+     * @title Arguments = +0d, +0d
+     */
+    public void testB7() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(+0d, t.run(+0d, +0d));
+    }
+
+    /**
+     * @title Arguments = 2.7d, 2.7d
+     */
+    public void testB8() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(0d, t.run(2.7d, 2.7d));
+    }
+
+    /**
+     * @title Arguments = Double.MAX_VALUE, Double.MAX_VALUE
+     */
+    public void testB9() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(0d, t.run(Double.MAX_VALUE, Double.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Double.MIN_VALUE, 4.9E-324
+     */
+    public void testB10() {
+        T_sub_double_2addr_1 t = new T_sub_double_2addr_1();
+        assertEquals(0d, t.run(Double.MIN_VALUE, 4.9E-324));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - float, double
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A24 
+     * @title  number of registers
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - double, reference
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint B1 
+     * @title  types of arguments - int, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d
new file mode 100644
index 0000000..8df12c1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2addr_1.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java
new file mode 100644
index 0000000..d99e5ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double_2addr.d;
+
+public class T_sub_double_2addr_1 {
+
+    public double run(double a, double b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d
new file mode 100644
index 0000000..0b37443
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2addr_2.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       const v3, 3.1415
+       sub-double/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d
new file mode 100644
index 0000000..a866a14
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2addr_3.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)D
+.limit regs 7
+
+       sub-double/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java
new file mode 100644
index 0000000..eb60bf7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_double_2addr.d;
+
+public class T_sub_double_2addr_3 {
+
+    public double run(long a, double b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d
new file mode 100644
index 0000000..a3236ef
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2addr_4.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double/2addr v3, v2
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d
new file mode 100644
index 0000000..aa69895
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_2addr_5.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DD)D
+.limit regs 7
+
+       sub-double/2addr v3, v7
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d
new file mode 100644
index 0000000..07bc954
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d
@@ -0,0 +1,37 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_double_6.java
+.class public dot.junit.opcodes.sub_double_2addr.d.T_sub_double_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)V
+.limit regs 7
+       move v0, v5
+       move v1, v5
+       move v2, v6
+       move v3, v6       
+       sub-double/2addr v0, v2
+       return-void
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/Test_sub_float.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/Test_sub_float.java
new file mode 100644
index 0000000..2e41c99
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/Test_sub_float.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_float.d.T_sub_float_1;
+import dot.junit.opcodes.sub_float.d.T_sub_float_5;
+
+
+public class Test_sub_float extends DxTestCase {
+
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(-0.44000006f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(3.14f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title 
+     */
+    public void testN3() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(-0.44000006f, t.run(-3.14f, -2.7f));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this subtraction of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_sub_float_5 t = new T_sub_float_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB4() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(+0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = +0f, +0f
+     */
+    public void testB7() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(+0f, t.run(+0f, +0f));
+    }
+
+    /**
+     * @title Arguments = 2.7f, 2.7f
+     */
+    public void testB8() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(0f, t.run(2.7f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB9() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(0f, t.run(Float.MAX_VALUE, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB10() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(0f, t.run(Float.MIN_VALUE, 1.4E-45f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -Float.MAX_VALUE
+     */
+    public void testB11() {
+        T_sub_float_1 t = new T_sub_float_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                -3.402823E+38F));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float.d.T_sub_float_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float.d.T_sub_float_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float.d.T_sub_float_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float.d.T_sub_float_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d
new file mode 100644
index 0000000..39f6708
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_1.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java
new file mode 100644
index 0000000..573404e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float.d;
+
+public class T_sub_float_1 {
+
+    public float run(float a, float b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d
new file mode 100644
index 0000000..c144976
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 5
+
+       move v2, v3
+       const-wide v3, 3.1415
+       sub-float v0, v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d
new file mode 100644
index 0000000..0456de2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_3.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 5
+
+       move v2, v3
+       const-wide v3, 9475928
+       sub-float v0, v3, v2
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d
new file mode 100644
index 0000000..1c73e66
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_4.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float v0, v1, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d
new file mode 100644
index 0000000..c851a5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_5.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 4
+
+       sub-float v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java
new file mode 100644
index 0000000..dd3a944
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float.d;
+
+public class T_sub_float_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d
new file mode 100644
index 0000000..c069f2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_6.java
+.class public dot.junit.opcodes.sub_float.d.T_sub_float_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java
new file mode 100644
index 0000000..5d934b1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_1;
+import dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_5;
+
+public class Test_sub_float_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 2.7f, 3.14f
+     */
+    public void testN1() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(-0.44000006f, t.run(2.7f, 3.14f));
+    }
+
+    /**
+     * @title Arguments = 0, -3.14f
+     */
+    public void testN2() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(3.14f, t.run(0, -3.14f));
+    }
+
+    /**
+     * @title 
+     */
+    public void testN3() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(-0.44000006f, t.run(-3.14f, -2.7f));
+    }
+
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this subtraction of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_sub_float_2addr_5 t = new T_sub_float_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.NaN
+     */
+    public void testB1() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.NEGATIVE_INFINITY
+     */
+    public void testB2() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                Float.NEGATIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY,
+     * Float.POSITIVE_INFINITY
+     */
+    public void testB3() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
+                Float.POSITIVE_INFINITY));
+    }
+
+    /**
+     * @title Arguments = Float.POSITIVE_INFINITY, -2.7f
+     */
+    public void testB4() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
+                -2.7f));
+    }
+
+    /**
+     * @title Arguments = +0, -0f
+     */
+    public void testB5() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(+0f, t.run(+0f, -0f));
+    }
+
+    /**
+     * @title Arguments = -0f, -0f
+     */
+    public void testB6() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(0f, t.run(-0f, -0f));
+    }
+
+    /**
+     * @title Arguments = +0f, +0f
+     */
+    public void testB7() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(+0f, t.run(+0f, +0f));
+    }
+
+    /**
+     * @title Arguments = 2.7f, 2.7f
+     */
+    public void testB8() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(0f, t.run(2.7f, 2.7f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, Float.MAX_VALUE
+     */
+    public void testB9() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(0f, t.run(Float.MAX_VALUE, Float.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Float.MIN_VALUE, -1.4E-45f
+     */
+    public void testB10() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(0f, t.run(Float.MIN_VALUE, 1.4E-45f));
+    }
+
+    /**
+     * @title Arguments = Float.MAX_VALUE, -Float.MAX_VALUE
+     */
+    public void testB11() {
+        T_sub_float_2addr_1 t = new T_sub_float_2addr_1();
+        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
+                -3.402823E+38F));
+    }
+
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d
new file mode 100644
index 0000000..d1c6e61
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_1.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java
new file mode 100644
index 0000000..0838c38
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float_2addr.d;
+
+public class T_sub_float_2addr_1 {
+
+    public float run(float a, float b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d
new file mode 100644
index 0000000..3f3b632
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_2.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 5
+
+       move v2, v3
+       const-wide v3, 3.1415
+       sub-float/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d
new file mode 100644
index 0000000..5a5f610
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_3.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 5
+
+       move v2, v3
+       const-wide v3, 9475928
+       sub-float/2addr v3, v2
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d
new file mode 100644
index 0000000..f60a149
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_4.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float/2addr v1, v3
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d
new file mode 100644
index 0000000..561ed3c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_5.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)F
+.limit regs 4
+
+       sub-float/2addr v2, v3
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java
new file mode 100644
index 0000000..5a0c748
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_float_2addr.d;
+
+public class T_sub_float_2addr_5 {
+
+    public float run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d
new file mode 100644
index 0000000..8d94709
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_float_2addr_6.java
+.class public dot.junit.opcodes.sub_float_2addr.d.T_sub_float_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(FF)F
+.limit regs 4
+
+       sub-float/2addr v2, v4
+       return v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/Test_sub_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/Test_sub_int.java
new file mode 100644
index 0000000..4a491cf
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/Test_sub_int.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_int.d.T_sub_int_1;
+import dot.junit.opcodes.sub_int.d.T_sub_int_5;
+
+public class Test_sub_int extends DxTestCase {
+
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(4, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 0, 255
+     */
+    public void testN2() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(-255, t.run(0, 255));
+    }
+
+    /**
+     * @title Arguments = 0, -65536
+     */
+    public void testN3() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(65536, t.run(0, -65536));
+    }
+
+    /**
+     * @title Arguments = 0, -2147483647
+     */
+    public void testN4() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(0, -2147483647));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this subtraction of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_sub_int_5 t = new  T_sub_int_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(-2147483647, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, -1
+     */
+    public void testB3() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB4() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(-2147483648, t.run(0, -Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB7() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(2147483646, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB8() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(-2147483647, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB9() {
+        T_sub_int_1 t = new T_sub_int_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int.d.T_sub_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int.d.T_sub_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int.d.T_sub_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int.d.T_sub_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d
new file mode 100644
index 0000000..019f739
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_1.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       sub-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java
new file mode 100644
index 0000000..46c8b3b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int.d;
+
+public class T_sub_int_1 {
+
+    public int run(int a, int b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d
new file mode 100644
index 0000000..2d6c43f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 123456.0
+       sub-int v0, v2, v0
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d
new file mode 100644
index 0000000..4ff0912
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_3.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 123456675
+       sub-int v0, v0, v2
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d
new file mode 100644
index 0000000..f3b57fc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_4.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       sub-int v0, v1, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d
new file mode 100644
index 0000000..f813789
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_5.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 4
+
+       sub-int v0, v2, v3
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java
new file mode 100644
index 0000000..ecc613b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int.d;
+
+public class T_sub_int_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d
new file mode 100644
index 0000000..b45a470
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_6.java
+.class public dot.junit.opcodes.sub_int.d.T_sub_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       sub-int v0, v2, v4
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java
new file mode 100644
index 0000000..cabd0f6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_1;
+import dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_5;
+
+public class Test_sub_int_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 8, 4
+     */
+    public void testN1() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(4, t.run(8, 4));
+    }
+
+    /**
+     * @title Arguments = 0, 255
+     */
+    public void testN2() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(-255, t.run(0, 255));
+    }
+
+    /**
+     * @title Arguments = 0, -65536
+     */
+    public void testN3() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(65536, t.run(0, -65536));
+    }
+
+    /**
+     * @title Arguments = 0, -2147483647
+     */
+    public void testN4() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(Integer.MAX_VALUE, t.run(0, -2147483647));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this subtraction of float and int makes no sense but shall not crash the VM.  
+     */
+    public void testN5() {
+        T_sub_int_2addr_5 t = new  T_sub_int_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+    /**
+     * @title Arguments = 0, Integer.MAX_VALUE
+     */
+    public void testB1() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(-2147483647, t.run(0, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
+     */
+    public void testB2() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, -1
+     */
+    public void testB3() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, -1));
+    }
+
+    /** 
+     * @title Arguments = Integer.MIN_VALUE, 1
+     */
+    public void testB4() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 0, 0
+     */
+    public void testB5() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(0, t.run(0, 0));
+    }
+
+    /**
+     * @title Arguments = 0, -Integer.MIN_VALUE
+     */
+    public void testB6() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(-2147483648, t.run(0, -Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, 1
+     */
+    public void testB7() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(2147483646, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1, Integer.MIN_VALUE
+     */
+    public void testB8() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(-2147483647, t.run(1, Integer.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB9() {
+        T_sub_int_2addr_1 t = new T_sub_int_2addr_1();
+        assertEquals(-1, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d
new file mode 100644
index 0000000..203da0d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_1.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       sub-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java
new file mode 100644
index 0000000..03dcff2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int_2addr.d;
+
+public class T_sub_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a-b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d
new file mode 100644
index 0000000..e3e5cab
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_2.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 123456.0
+       sub-int/2addr v2, v0
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d
new file mode 100644
index 0000000..cad0b89
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_3.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide v0, 123456675
+       sub-int/2addr v0, v2
+       return v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d
new file mode 100644
index 0000000..efce9cc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_4.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       sub-int/2addr v0, v2
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d
new file mode 100644
index 0000000..77b2c6f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_5.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 3
+
+       sub-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java
new file mode 100644
index 0000000..14c9b65
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_int_2addr.d;
+
+public class T_sub_int_2addr_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d
new file mode 100644
index 0000000..1705eb7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_int_2addr_6.java
+.class public dot.junit.opcodes.sub_int_2addr.d.T_sub_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       sub-int/2addr v1, v3
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/Test_sub_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/Test_sub_long.java
new file mode 100644
index 0000000..913ed6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/Test_sub_long.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_long.d.T_sub_long_1;
+import dot.junit.opcodes.sub_long.d.T_sub_long_2;
+
+public class Test_sub_long extends DxTestCase {
+
+    /**
+     * @title Arguments = 1111127348242l, 11111111114l
+     */
+    public void testN1() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(1100016237128l, t.run(1111127348242l, 11111111114l));
+    }
+
+    /**
+     * @title Arguments = 0, 1111127348242l
+     */
+    public void testN2() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(-1111127348242l, t.run(0, 1111127348242l));
+    }
+
+    /**
+     * @title Arguments = 0, -11111111114l
+     */
+    public void testN3() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(11111111114l, t.run(0, -11111111114l));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this subtraction of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+         T_sub_long_2 t = new  T_sub_long_2();
+        try {
+            t.run(12345l, 3.14d);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Arguments = 0l, Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(-9223372036854775807L, t.run(0l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 9223372036854775807L, Long.MAX_VALUE
+     */
+    public void testB2() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(0l, t.run(9223372036854775807L, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, -1l
+     */
+    public void testB3() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1l
+     */
+    public void testB4() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(9223372036854775807L, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = 0l, 0l
+     */
+    public void testB5() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(0l, t.run(0l, 0l));
+    }
+
+    /**
+     * @title Arguments = 0l, -Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_sub_long_1 t = new T_sub_long_1();
+        assertEquals(-9223372036854775808L, t.run(0l, -Long.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long.d.T_sub_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long.d.T_sub_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long.d.T_sub_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, reference
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long.d.T_sub_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d
new file mode 100644
index 0000000..4367232
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_1.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       sub-long v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java
new file mode 100644
index 0000000..24a0f90
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long.d;
+
+public class T_sub_long_1 {
+    
+    public long run(long a, long b) {
+        return a-b;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d
new file mode 100644
index 0000000..6e191ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 7
+       sub-long v0, v3, v5
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java
new file mode 100644
index 0000000..733b4dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long.d;
+
+public class T_sub_long_2 {
+    
+    public long run(long a, double b) {
+        return 0;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d
new file mode 100644
index 0000000..5fe421f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_3.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       const v3, 12346
+       sub-long v0, v3, v5
+       return-wide v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d
new file mode 100644
index 0000000..7ab2d2d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_4.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       const v5, 12346.0
+       sub-long v0, v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d
new file mode 100644
index 0000000..c498408
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_5.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       sub-long v0, v3, v2
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d
new file mode 100644
index 0000000..f9f2065
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_6.java
+.class public dot.junit.opcodes.sub_long.d.T_sub_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       sub-long v0, v3, v7
+       return-wide v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java
new file mode 100644
index 0000000..27a3d09
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_1;
+import dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_2;
+
+public class Test_sub_long_2addr extends DxTestCase {
+
+    /**
+     * @title Arguments = 1111127348242l, 11111111114l
+     */
+    public void testN1() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(1100016237128l, t.run(1111127348242l, 11111111114l));
+    }
+
+    /**
+     * @title Arguments = 0, 1111127348242l
+     */
+    public void testN2() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(-1111127348242l, t.run(0, 1111127348242l));
+    }
+
+    /**
+     * @title Arguments = 0, -11111111114l
+     */
+    public void testN3() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(11111111114l, t.run(0, -11111111114l));
+    }
+
+    /**
+     * @title Types of arguments - long, double. Dalvik doens't distinguish 64-bits types internally,
+     * so this subtraction of double and long makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_sub_long_2addr_2 t = new  T_sub_long_2addr_2();
+        try {
+            t.run(12345l, 3.14d);
+        } catch (Throwable e) {
+        }
+    }  
+    
+    /**
+     * @title Arguments = 0l, Long.MAX_VALUE
+     */
+    public void testB1() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(-9223372036854775807L, t.run(0l, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = 9223372036854775807L, Long.MAX_VALUE
+     */
+    public void testB2() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(0l, t.run(9223372036854775807L, Long.MAX_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE, -1l
+     */
+    public void testB3() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE, 1l
+     */
+    public void testB4() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(9223372036854775807L, t.run(Long.MIN_VALUE, 1l));
+    }
+
+    /**
+     * @title Arguments = 0l, 0l
+     */
+    public void testB5() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(0l, t.run(0l, 0l));
+    }
+
+    /**
+     * @title Arguments = 0l, -Long.MIN_VALUE
+     */
+    public void testB6() {
+        T_sub_long_2addr_1 t = new T_sub_long_2addr_1();
+        assertEquals(-9223372036854775808L, t.run(0l, -Long.MIN_VALUE));
+    }
+
+    
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, float
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, reference
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d
new file mode 100644
index 0000000..f416a03
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_1.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       sub-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java
new file mode 100644
index 0000000..8d66c2b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long_2addr.d;
+
+public class T_sub_long_2addr_1 {
+    
+    public long run(long a, long b) {
+        return a-b;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d
new file mode 100644
index 0000000..eb91aff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_2.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 7
+       sub-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java
new file mode 100644
index 0000000..33f4b88
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.sub_long_2addr.d;
+
+public class T_sub_long_2addr_2 {
+    
+    public long run(long a, double b) {
+        return 0;
+    }
+    
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d
new file mode 100644
index 0000000..bea4aea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_3.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       const v3, 12346
+       sub-long/2addr v3, v5
+       return-wide v5
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d
new file mode 100644
index 0000000..57d6c24
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_4.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+       const v5, 12346.0
+       sub-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d
new file mode 100644
index 0000000..da99ce1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_5.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       sub-long/2addr v3, v2
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d
new file mode 100644
index 0000000..fb874e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_sub_long_2addr_6.java
+.class public dot.junit.opcodes.sub_long_2addr.d.T_sub_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 7
+
+       sub-long/2addr v3, v7
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java
new file mode 100644
index 0000000..2701607
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.ushr_int.d.T_ushr_int_1;
+import dot.junit.opcodes.ushr_int.d.T_ushr_int_5;
+
+public class Test_ushr_int extends DxTestCase {
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(7, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(8, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(0x7FFFFFF8, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(0, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(16, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (int >>> float) makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_ushr_int_5 t = new  T_ushr_int_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(0x40000000, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_ushr_int_1 t = new T_ushr_int_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int.d.T_ushr_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int.d.T_ushr_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int.d.T_ushr_int_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int.d.T_ushr_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d
new file mode 100644
index 0000000..dd22d10
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_1.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int v1, v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java
new file mode 100644
index 0000000..b633fc2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int.d;
+
+public class T_ushr_int_1 {
+
+    public int run(int a, int b) {
+        return a >>> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d
new file mode 100644
index 0000000..75880f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       move v1, v2
+       const-wide v2, 12345.0
+       ushr-int v1, v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d
new file mode 100644
index 0000000..802f349
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_3.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_3
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)I
+.limit regs 4
+
+       ushr-int v1, v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d
new file mode 100644
index 0000000..289c777
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_4.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int v1, v1, v0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d
new file mode 100644
index 0000000..2fdf2b6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_5.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_5
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 3
+
+       ushr-int v1, v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java
new file mode 100644
index 0000000..4b5c31f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int.d;
+
+public class T_ushr_int_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d
new file mode 100644
index 0000000..b216968
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_6.java
+.class public dot.junit.opcodes.ushr_int.d.T_ushr_int_6
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int v1, v1, v3
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java
new file mode 100644
index 0000000..e1c4217
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_1;
+import dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_5;
+
+public class Test_ushr_int_2addr extends DxTestCase {
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(7, t.run(15, 1));
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(8, t.run(33, 2));
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(0x7FFFFFF8, t.run(-15, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(0, t.run(1, -1));
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(16, t.run(33, 33));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (int >>> float) makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_ushr_int_2addr_5 t = new  T_ushr_int_2addr_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(0, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(0x40000000, t.run(Integer.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_ushr_int_2addr_1 t = new T_ushr_int_2addr_1();
+        assertEquals(1, t.run(1, 0));
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d
new file mode 100644
index 0000000..5ee3392
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_1.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int/2addr v1, v2
+       return v1
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java
new file mode 100644
index 0000000..dd53d3d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_2addr.d;
+
+public class T_ushr_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a >>> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d
new file mode 100644
index 0000000..d7be0ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_2.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       move v1, v2
+       const-wide v2, 12345.0
+       ushr-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d
new file mode 100644
index 0000000..a7e8263
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_3.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_3
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IJ)I
+.limit regs 4
+
+       ushr-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d
new file mode 100644
index 0000000..330ce0a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_4.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int/2addr  v1, v0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d
new file mode 100644
index 0000000..d5906eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_5.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 3
+
+       ushr-int/2addr v1, v2
+       return v1
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java
new file mode 100644
index 0000000..3e1776c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_2addr.d;
+
+public class T_ushr_int_2addr_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d
new file mode 100644
index 0000000..0e3753c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_2addr_6.java
+.class public dot.junit.opcodes.ushr_int_2addr.d.T_ushr_int_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       ushr-int/2addr v1, v3
+       return v1
+.end method
+
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java
new file mode 100644
index 0000000..99b3ac9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_1;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_13;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_2;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_3;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_4;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_5;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_6;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_7;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_8;
+import dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_9;
+
+
+public class Test_ushr_int_lit8 extends DxTestCase {
+    /**
+     * @title 15 >> 1
+     */
+    public void testN1() {
+        T_ushr_int_lit8_1 t = new T_ushr_int_lit8_1();
+        assertEquals(7, t.run());
+    }
+
+    /**
+     * @title 33 >> 2
+     */
+    public void testN2() {
+        T_ushr_int_lit8_2 t = new T_ushr_int_lit8_2();
+        assertEquals(8, t.run());
+    }
+
+    /**
+     * @title -15 >> 1
+     */
+    public void testN3() {
+        T_ushr_int_lit8_3 t = new T_ushr_int_lit8_3();
+        assertEquals(0x7FFFFFF8, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_ushr_int_lit8_4 t = new T_ushr_int_lit8_4();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Verify that shift distance is actually in range 0 to 32.
+     */
+    public void testN5() {
+        T_ushr_int_lit8_5 t = new T_ushr_int_lit8_5();
+        assertEquals(16, t.run());
+    }
+    
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float >>> ) makes no sense but shall not crash the VM.  
+     */
+    public void testN6() {
+        T_ushr_int_lit8_13 t = new  T_ushr_int_lit8_13();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_ushr_int_lit8_6 t = new T_ushr_int_lit8_6();
+        assertEquals(0, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_ushr_int_lit8_7 t = new T_ushr_int_lit8_7();
+        assertEquals(0x3FFFFFFF, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_ushr_int_lit8_8 t = new T_ushr_int_lit8_8();
+        assertEquals(0x40000000, t.run());
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_ushr_int_lit8_9 t = new T_ushr_int_lit8_9();
+        assertEquals(1, t.run());
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - double, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_10");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_11");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_12");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_14");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d
new file mode 100644
index 0000000..3d6d12d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_1.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 15
+       ushr-int/lit8 v1, v1, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java
new file mode 100644
index 0000000..35f5305
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_1 {
+
+    public int run() {
+        return 15 >>> 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d
new file mode 100644
index 0000000..66e89fa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_10.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_10
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide v0, 12345456788.0
+       ushr-int/lit8 v1, v0, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d
new file mode 100644
index 0000000..d0b5a53
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_11.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_11
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+       const-wide v0, 12345456788
+       ushr-int/lit8 v1, v0, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d
new file mode 100644
index 0000000..9925d72
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_12.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_12
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 2
+
+       ushr-int/lit8 v0, v1, 1
+       return v0
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d
new file mode 100644
index 0000000..431983f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_13.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_13
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 3
+
+       ushr-int/lit8 v1, v2, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java
new file mode 100644
index 0000000..42f09dc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_13 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d
new file mode 100644
index 0000000..7bf0d26
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_14.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_14
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 3
+
+       ushr-int/lit8 v1, v3, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d
new file mode 100644
index 0000000..2727421
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_2.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 33
+       ushr-int/lit8 v1, v1, 2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java
new file mode 100644
index 0000000..8ef472e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_2 {
+
+    public int run() {
+        return 32 >>> 2;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d
new file mode 100644
index 0000000..d51d0ad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_3.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_3
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, -15
+       ushr-int/lit8 v1, v1, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java
new file mode 100644
index 0000000..0917deb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_3 {
+
+    public int run() {
+        return -15 >>> 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d
new file mode 100644
index 0000000..c69a8cd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_4.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 1
+       ushr-int/lit8 v1, v1, -1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java
new file mode 100644
index 0000000..e0224f5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_4 {
+
+    public int run() {
+        return 1 >>> -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d
new file mode 100644
index 0000000..9e75732
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_5.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_5
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 33
+       ushr-int/lit8 v1, v1, 33
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java
new file mode 100644
index 0000000..b1d83aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_5 {
+
+    public int run() {
+        return 33 >>> 33;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d
new file mode 100644
index 0000000..8387c15
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_6.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_6
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 0
+       ushr-int/lit8 v1, v1, -1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java
new file mode 100644
index 0000000..548014a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_6 {
+
+    public int run() {
+        return 0 >>> -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d
new file mode 100644
index 0000000..1a49829
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_7.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_7
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       ushr-int/lit8 v1, v1, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java
new file mode 100644
index 0000000..1e0b00f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_7 {
+
+    public int run() {
+        return Integer.MAX_VALUE >>> 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d
new file mode 100644
index 0000000..415d6d6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_8.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_8
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, -2147483648
+       ushr-int/lit8 v1, v1, 1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java
new file mode 100644
index 0000000..6e6a65e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_8 {
+
+    public int run() {
+        return Integer.MIN_VALUE >>> 1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d
new file mode 100644
index 0000000..34be720
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_int_lit8_9.java
+.class public dot.junit.opcodes.ushr_int_lit8.d.T_ushr_int_lit8_9
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const/16 v1, 1
+       ushr-int/lit8 v1, v1, 0
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java
new file mode 100644
index 0000000..a69257a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_int_lit8.d;
+
+public class T_ushr_int_lit8_9 {
+
+    public int run() {
+        return 1 >>> 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java
new file mode 100644
index 0000000..338d067
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.ushr_long.d.T_ushr_long_1;
+import dot.junit.opcodes.ushr_long.d.T_ushr_long_2;
+
+public class Test_ushr_long extends DxTestCase {
+    /**
+     * @title Arguments = 40000000000l, 3
+     */
+    public void testN1() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(5000000000l, t.run(40000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 40000000000l, 1
+     */
+    public void testN2() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(20000000000l, t.run(40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -123456789l, 1
+     */
+    public void testN3() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0x7FFFFFFFFC521975l, t.run(-123456789l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Arguments = 123456789l, 64
+     */
+    public void testN5() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(123456789l, t.run(123456789l, 64));
+    }
+    
+    /**
+     * @title Arguments = 123456789l, 63
+     */
+    public void testN6() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0l, t.run(123456789l, 63));
+    }
+    
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this (double >>> int) makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_ushr_long_2 t = new T_ushr_long_2();
+        try {
+            t.run(3.14d, 1);
+        } catch (Throwable e) {
+        }
+    } 
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0l, t.run(0l, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(0x4000000000000000l, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_ushr_long_1 t = new T_ushr_long_1();
+        assertEquals(1l, t.run(1l, 0));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long.d.T_ushr_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long.d.T_ushr_long_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long.d.T_ushr_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long.d.T_ushr_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, reference
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long.d.T_ushr_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d
new file mode 100644
index 0000000..5479c4e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_1.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long v1, v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java
new file mode 100644
index 0000000..1b2517e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long.d;
+
+public class T_ushr_long_1 {
+
+    public long run(long a, int b) {
+        return a >>> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d
new file mode 100644
index 0000000..e8a6322
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 6
+
+       ushr-long v0, v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java
new file mode 100644
index 0000000..e278f8a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long.d;
+
+public class T_ushr_long_2 {
+
+    public long run(double b, int i) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d
new file mode 100644
index 0000000..1a7a9eb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_3.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       move v2, v3
+       ushr-long v1, v2, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d
new file mode 100644
index 0000000..03ae1aa
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_4.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 6
+
+       const v0, 12345.0
+       ushr-long v0, v0, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d
new file mode 100644
index 0000000..05560ac
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_5.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long v1, v1, v0
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d
new file mode 100644
index 0000000..6e7d40a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_6.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long v1, v1, v4
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d
new file mode 100644
index 0000000..d2f672b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_7.java
+.class public dot.junit.opcodes.ushr_long.d.T_ushr_long_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 6
+
+       ushr-long v1, v2, v4
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java
new file mode 100644
index 0000000..72747f4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_1;
+import dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_2;
+
+public class Test_ushr_long_2addr extends DxTestCase {
+    /**
+     * @title Arguments =  40000000000l, 3
+     */
+    public void testN1() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(5000000000l, t.run(40000000000l, 3));
+    }
+
+    /**
+     * @title Arguments = 40000000000l, 1
+     */
+    public void testN2() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(20000000000l, t.run(40000000000l, 1));
+    }
+
+    /**
+     * @title Arguments = -123456789l, 1
+     */
+    public void testN3() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0x7FFFFFFFFC521975l, t.run(-123456789l, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & -1
+     */
+    public void testN4() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0l, t.run(1l, -1));
+    }
+
+    /**
+     * @title Arguments = 123456789l, 64
+     */
+    public void testN5() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(123456789l, t.run(123456789l, 64));
+    }
+
+    /**
+     * @title Arguments = 123456789l, 63
+     */
+    public void testN6() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0l, t.run(123456789l, 63));
+    }
+
+    /**
+     * @title Types of arguments - double, int. Dalvik doens't distinguish 64-bits types internally,
+     * so this (double >>> int) makes no sense but shall not crash the VM.  
+     */
+    public void testN7() {
+        T_ushr_long_2addr_2 t = new T_ushr_long_2addr_2();
+        try {
+            t.run(3.14d, 1);
+        } catch (Throwable e) {
+        }
+    } 
+
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0l, t.run(0l, -1));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & 1
+     */
+    public void testB2() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = Long.MIN_VALUE & 1
+     */
+    public void testB3() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(0x4000000000000000l, t.run(Long.MIN_VALUE, 1));
+    }
+
+    /**
+     * @title Arguments = 1 & 0
+     */
+    public void testB4() {
+        T_ushr_long_2addr_1 t = new T_ushr_long_2addr_1();
+        assertEquals(1l, t.run(1l, 0));
+    }
+    
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, double
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_7");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, int
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - float, int
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, reference
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d
new file mode 100644
index 0000000..4b154c5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_1.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java
new file mode 100644
index 0000000..142cda3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long_2addr.d;
+
+public class T_ushr_long_2addr_1 {
+
+    public long run(long a, int b) {
+        return a >>> b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d
new file mode 100644
index 0000000..22a3e6d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_2.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DI)J
+.limit regs 6
+
+       ushr-long/2addr v3, v5
+       return-wide v3
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java
new file mode 100644
index 0000000..af70b1c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.ushr_long_2addr.d;
+
+public class T_ushr_long_2addr_2 {
+
+    public long run(double a, int b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d
new file mode 100644
index 0000000..c76441e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_3.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       move v0, v3
+       ushr-long/2addr v0, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d
new file mode 100644
index 0000000..4f03522
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_4.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       const v1, 12345.0
+       ushr-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d
new file mode 100644
index 0000000..12e930c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_5.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long/2addr v1, v0
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d
new file mode 100644
index 0000000..0d1898a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_6.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JI)J
+.limit regs 4
+
+       ushr-long/2addr v1, v4
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d
new file mode 100644
index 0000000..b645617
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_ushr_long_2addr_7.java
+.class public dot.junit.opcodes.ushr_long_2addr.d.T_ushr_long_2addr_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JD)J
+.limit regs 6
+
+       ushr-long/2addr v2, v4
+       return-wide v2
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/Test_xor_int.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/Test_xor_int.java
new file mode 100644
index 0000000..8d976ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/Test_xor_int.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_int.d.T_xor_int_1;
+import dot.junit.opcodes.xor_int.d.T_xor_int_5;
+
+public class Test_xor_int extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+         T_xor_int_1 t = new T_xor_int_1();
+         assertEquals(7, t.run(15, 8));
+    }
+    
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+         T_xor_int_1 t = new T_xor_int_1();
+         assertEquals(9, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe, -1
+     */
+    public void testN3() {
+         T_xor_int_1 t = new T_xor_int_1();
+         assertEquals(0xFFFF3501, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (int ^ float) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_xor_int_5 t = new  T_xor_int_5();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, -1
+     */
+    public void testB1() {
+        T_xor_int_1 t = new T_xor_int_1();
+        assertEquals(-1, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_int_1 t = new T_xor_int_1();
+        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+    
+    
+
+    /**
+     * @constraint B1
+     * @title types of arguments - long, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int.d.T_xor_int_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - reference, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int.d.T_xor_int_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int.d.T_xor_int_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d
new file mode 100644
index 0000000..2c2fbfb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_1.java
+.class public dot.junit.opcodes.xor_int.d.T_xor_int_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int v1, v1, v2
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java
new file mode 100644
index 0000000..75f5df4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int.d;
+
+public class T_xor_int_1 {
+
+    public int run(int a, int b) {
+        return a ^ b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d
new file mode 100644
index 0000000..339a3e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d
@@ -0,0 +1,36 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2.java
+.class public dot.junit.opcodes.xor_int.d.T_xor_int_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       move v1, v2 
+       const-wide/16 v2, 12345
+       xor-int v1, v1, v2
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d
new file mode 100644
index 0000000..b733277
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_3.java
+.class public dot.junit.opcodes.xor_int.d.T_xor_int_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int v1, v1, v0
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d
new file mode 100644
index 0000000..879afe5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_5.java
+.class public dot.junit.opcodes.xor_int.d.T_xor_int_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 3
+
+       xor-int v1, v1, v2
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java
new file mode 100644
index 0000000..5c50e59
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int.d;
+
+public class T_xor_int_5 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d
new file mode 100644
index 0000000..0768d87
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_6.java
+.class public dot.junit.opcodes.xor_int.d.T_xor_int_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int v1, v1, v3
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java
new file mode 100644
index 0000000..630bf5d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_1;
+import dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_4;
+
+public class Test_xor_int_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+         T_xor_int_2addr_1 t = new T_xor_int_2addr_1();
+         assertEquals(7, t.run(15, 8));
+    }
+    
+    /**
+     * @title Arguments = 0xfffffff8, 0xfffffff1
+     */
+    public void testN2() {
+         T_xor_int_2addr_1 t = new T_xor_int_2addr_1();
+         assertEquals(9, t.run(0xfffffff8, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xcafe, -1
+     */
+    public void testN3() {
+         T_xor_int_2addr_1 t = new T_xor_int_2addr_1();
+         assertEquals(0xFFFF3501, t.run(0xcafe, -1));
+    }
+    
+    /**
+     * @title Types of arguments - int, float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (int ^ float) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_xor_int_2addr_4 t = new  T_xor_int_2addr_4();
+        try {
+            t.run(1, 3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, -1
+     */
+    public void testB1() {
+        T_xor_int_2addr_1 t = new T_xor_int_2addr_1();
+        assertEquals(-1, t.run(0, -1));
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_int_2addr_1 t = new T_xor_int_2addr_1();
+        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
+    }
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d
new file mode 100644
index 0000000..561db60
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2addr_1.java
+.class public dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java
new file mode 100644
index 0000000..2d4a699
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_2addr.d;
+
+public class T_xor_int_2addr_1 {
+
+    public int run(int a, int b) {
+        return a ^ b;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d
new file mode 100644
index 0000000..7d19a9b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2addr_2.java
+.class public dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 4
+
+       const-wide/16 v2, 12345
+       xor-int/2addr v1, v2
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d
new file mode 100644
index 0000000..f51a717
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2addr_3.java
+.class public dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int/2addr v1, v0
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d
new file mode 100644
index 0000000..cc64eb3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2addr_4.java
+.class public dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(IF)I
+.limit regs 3
+
+       xor-int/2addr v1, v2
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java
new file mode 100644
index 0000000..f779ebc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_2addr.d;
+
+public class T_xor_int_2addr_4 {
+
+    public int run(int a, float b) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d
new file mode 100644
index 0000000..5430394
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_2addr_5.java
+.class public dot.junit.opcodes.xor_int_2addr.d.T_xor_int_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(II)I
+.limit regs 3
+
+       xor-int/2addr v1, v3
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java
new file mode 100644
index 0000000..e31a49c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_1;
+import dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_2;
+import dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_3;
+import dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_4;
+import dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_7;
+
+public class Test_xor_int_lit16 extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+         T_xor_int_lit16_1 t = new T_xor_int_lit16_1();
+         assertEquals(7, t.run());
+     }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xfff1
+     */
+    public void testN2() {
+         T_xor_int_lit16_2 t = new T_xor_int_lit16_2();
+         assertEquals(9, t.run());
+     }
+    
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float ^ int) makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_xor_int_lit16_7 t = new T_xor_int_lit16_7();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, -1
+     */
+    public void testB1() {
+        T_xor_int_lit16_3 t = new T_xor_int_lit16_3();
+            assertEquals(-1, t.run());
+    }
+
+    /** 
+     * @title Arguments = Integer.MAX_VALUE, Short.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_int_lit16_4 t = new T_xor_int_lit16_4();
+            assertEquals(-2147450881, t.run());
+    }
+
+    
+    
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - long & int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference & int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d
new file mode 100644
index 0000000..ba07a33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_1.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 15
+       xor-int/lit16 v1, v1, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java
new file mode 100644
index 0000000..bff43df
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16.d;
+
+public class T_xor_int_lit16_1 {
+
+    public int run() {
+        return 15 ^ 8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d
new file mode 100644
index 0000000..6b5a110
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_2.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v2, -8
+       xor-int/lit16 v1, v2, -15
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java
new file mode 100644
index 0000000..938a23d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16.d;
+
+public class T_xor_int_lit16_2 {
+
+    public int run() {
+        return 0xfffffff8 ^ 0xfff1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d
new file mode 100644
index 0000000..56f0458
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_3.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       xor-int/lit16 v1, v1, -1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java
new file mode 100644
index 0000000..2bc9c62
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16.d;
+
+public class T_xor_int_lit16_3 {
+
+    public int run() {
+        return 0 ^ -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d
new file mode 100644
index 0000000..ec92408
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_4.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       xor-int/lit16 v1, v1, -32768
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java
new file mode 100644
index 0000000..6626871
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16.d;
+
+public class T_xor_int_lit16_4 {
+
+    public int run() {
+        return Integer.MAX_VALUE ^ Short.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d
new file mode 100644
index 0000000..a0906e6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_5.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide/16 v2, 12345
+       xor-int/lit16 v1, v2, -32768
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d
new file mode 100644
index 0000000..5aa6343
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_6.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       xor-int/lit16 v1, v2, 1
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d
new file mode 100644
index 0000000..ea16bae
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_7.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 3
+
+       xor-int/lit16 v1, v2, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java
new file mode 100644
index 0000000..d7b747e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit16.d;
+
+public class T_xor_int_lit16_7 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d
new file mode 100644
index 0000000..5d8cb85
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit16_8.java
+.class public dot.junit.opcodes.xor_int_lit16.d.T_xor_int_lit16_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 3
+
+       xor-int/lit16 v1, v3, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java
new file mode 100644
index 0000000..e06d5e1
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_1;
+import dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_2;
+import dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_3;
+import dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_4;
+import dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_7;
+
+public class Test_xor_int_lit8 extends DxTestCase {
+    /**
+     * @title Arguments = 15, 8
+     */
+    public void testN1() {
+         T_xor_int_lit8_1 t = new T_xor_int_lit8_1();
+         assertEquals(7, t.run());
+     }
+
+    /**
+     * @title Arguments = 0xfffffff8, 0xf1
+     */
+    public void testN2() {
+         T_xor_int_lit8_2 t = new T_xor_int_lit8_2();
+         assertEquals(9, t.run());
+     }
+    
+    /**
+     * @title Type of argument - float. Dalvik doens't distinguish 32-bits types internally,
+     * so this (float ^ int) makes no sense but shall not crash the VM.  
+     */
+    public void testN3() {
+        T_xor_int_lit8_7 t = new T_xor_int_lit8_7();
+        try {
+            t.run(3.14f);
+        } catch (Throwable e) {
+        }
+    }
+    
+    /**
+     * @title Arguments = 0, -1
+     */
+    public void testB1() {
+        T_xor_int_lit8_3 t = new T_xor_int_lit8_3();
+            assertEquals(-1, t.run());
+    }
+
+    /**
+     * @title Arguments = Integer.MAX_VALUE, Byte.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_int_lit8_4 t = new T_xor_int_lit8_4();
+            assertEquals(-2147483521, t.run());
+    }
+
+    
+
+    /**
+     * @constraint B1
+     * @title types of arguments - long, int
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B1 
+     * @title  types of arguments - reference, int
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    /**
+     * @constraint A23 
+     * @title  number of registers
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_8");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d
new file mode 100644
index 0000000..cb4d830
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_1.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 15
+       xor-int/lit16 v1, v1, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java
new file mode 100644
index 0000000..ff2c78b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8.d;
+
+public class T_xor_int_lit8_1 {
+
+    public int run() {
+        return 15 ^ 8;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d
new file mode 100644
index 0000000..8d23bf6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_2.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v2, -8
+       xor-int/lit16 v1, v2, -15
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java
new file mode 100644
index 0000000..d62fd56
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8.d;
+
+public class T_xor_int_lit8_2 {
+
+    public int run() {
+        return 0xfffffff8 ^ 0xf1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d
new file mode 100644
index 0000000..5953574
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_3.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 0
+       xor-int/lit16 v1, v1, -1
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java
new file mode 100644
index 0000000..31fa48c
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8.d;
+
+public class T_xor_int_lit8_3 {
+
+    public int run() {
+        return 0 ^ -1;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d
new file mode 100644
index 0000000..c2270c4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_4.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       const v1, 2147483647
+       xor-int/lit16 v1, v1, -128
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java
new file mode 100644
index 0000000..6b2d4f7
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8.d;
+
+public class T_xor_int_lit8_4 {
+
+    public int run() {
+        return Integer.MAX_VALUE ^ Byte.MIN_VALUE;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d
new file mode 100644
index 0000000..3a3da2b
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_5.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 4
+
+       const-wide/16 v2, 12345
+       xor-int/lit8 v1, v2, -128
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d
new file mode 100644
index 0000000..b3ab7e4
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_6.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()I
+.limit regs 3
+
+       xor-int/lit16 v1, v2, 1
+       return v1    
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d
new file mode 100644
index 0000000..74bf7e5
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_7.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_7
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(F)I
+.limit regs 3
+
+       xor-int/lit16 v1, v2, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java
new file mode 100644
index 0000000..ecd3130
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_int_lit8.d;
+
+public class T_xor_int_lit8_7 {
+
+    public int run(float f) {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d
new file mode 100644
index 0000000..0857ea6
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_int_lit8_8.java
+.class public dot.junit.opcodes.xor_int_lit8.d.T_xor_int_lit8_8
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(I)I
+.limit regs 3
+
+       xor-int/lit16 v1, v3, 8
+       return v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/Test_xor_long.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/Test_xor_long.java
new file mode 100644
index 0000000..dac7041
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/Test_xor_long.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_long.d.T_xor_long_1;
+import dot.junit.opcodes.xor_long.d.T_xor_long_2;
+
+public class Test_xor_long extends DxTestCase {
+    /**
+     * @title Arguments = 23423432423777l, 23423432423778l
+     */
+    public void testN1() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(3, t.run(23423432423777l, 23423432423778l));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff5, 0xfffffff1
+     */
+    public void testN2() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(4, t.run(0xfffffff5, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xABCDEFAB & -1
+     */
+    public void testN3() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(0x54321054, t.run(0xABCDEFAB, -1l));
+    }
+    
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this (double ^ long ) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_xor_long_2 t = new T_xor_long_2();
+        try {
+            t.run(3.14d, 1234l);
+        } catch (Throwable e) {
+        }
+    } 
+
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(-1l, t.run(0l, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(0xffffffff, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MAX_VALUE
+     */
+    public void testB3() {
+        T_xor_long_1 t = new T_xor_long_1();
+        assertEquals(0l, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title number of registers
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long.d.T_xor_long_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+
+    
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long.d.T_xor_long_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title types of arguments - float, long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long.d.T_xor_long_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title types of arguments - reference, long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long.d.T_xor_long_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d
new file mode 100644
index 0000000..fb345ea
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_1.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long v1, v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java
new file mode 100644
index 0000000..9389b63
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long.d;
+
+public class T_xor_long_1 {
+
+    public long run(long a, long b) {
+        return a ^ b; 
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d
new file mode 100644
index 0000000..52f7815
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DJ)J
+.limit regs 5
+
+       xor-long v1, v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java
new file mode 100644
index 0000000..64a5a9a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long.d;
+
+public class T_xor_long_2 {
+
+    public long run(double a, long b) {
+        return 0; 
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d
new file mode 100644
index 0000000..2042970
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_3.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       const/16 v3, 1234    
+       xor-long v1, v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d
new file mode 100644
index 0000000..28e9fff
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_4.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       const v3, 1234.0
+       xor-long v1, v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d
new file mode 100644
index 0000000..a48545f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_5.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long v1, v1, v0
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d
new file mode 100644
index 0000000..0e2c18f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_6.java
+.class public dot.junit.opcodes.xor_long.d.T_xor_long_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long v1, v1, v5
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java
new file mode 100644
index 0000000..8e4a4bc
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long_2addr;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+import dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_1;
+import dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_2;
+
+public class Test_xor_long_2addr extends DxTestCase {
+    /**
+     * @title Arguments = 23423432423777l, 23423432423778l
+     */
+    public void testN1() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(3, t.run(23423432423777l, 23423432423778l));
+    }
+
+    /**
+     * @title Arguments = 0xfffffff5, 0xfffffff1
+     */
+    public void testN2() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(4, t.run(0xfffffff5, 0xfffffff1));
+    }
+
+    /**
+     * @title Arguments = 0xABCDEFAB & -1
+     */
+    public void testN3() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(0x54321054, t.run(0xABCDEFAB, -1l));
+    }
+
+    /**
+     * @title Types of arguments - double, long. Dalvik doens't distinguish 64-bits types internally,
+     * so this (double ^ long ) makes no sense but shall not crash the VM.  
+     */
+    public void testN4() {
+        T_xor_long_2addr_2 t = new T_xor_long_2addr_2();
+        try {
+            t.run(3.14d, 1234l);
+        } catch (Throwable e) {
+        }
+    } 
+
+    
+    /**
+     * @title Arguments = 0 & -1
+     */
+    public void testB1() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(-1l, t.run(0l, -1l));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MIN_VALUE
+     */
+    public void testB2() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(0xffffffff, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
+    }
+
+    /**
+     * @title Arguments = Long.MAX_VALUE & Long.MAX_VALUE
+     */
+    public void testB3() {
+        T_xor_long_2addr_1 t = new T_xor_long_2addr_1();
+        assertEquals(0l, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
+    }
+
+    /**
+     * @constraint A24 
+     * @title  (number of registers).
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_6");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+    
+    
+
+
+    /**
+     * @constraint B1 
+     * @title types of arguments - int, long
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title types of arguments - float, long
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * 
+     * @constraint B1 
+     * @title types of arguments - reference, long
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d
new file mode 100644
index 0000000..7d84e33
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_1.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_1
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java
new file mode 100644
index 0000000..f146b32
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long_2addr.d;
+
+public class T_xor_long_2addr_1 {
+
+    public long run(long a, long b) {
+        return a ^ b; 
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d
new file mode 100644
index 0000000..977ce09
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_2.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_2
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(DJ)J
+.limit regs 5
+
+       xor-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java
new file mode 100644
index 0000000..dfa4c0f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.opcodes.xor_long_2addr.d;
+
+public class T_xor_long_2addr_2 {
+
+    public long run(double a, long b) {
+        return 0; 
+    }
+}
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d
new file mode 100644
index 0000000..d578efe
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_3.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_3
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       const/16 v3, 1234    
+       xor-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d
new file mode 100644
index 0000000..98c0cd8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d
@@ -0,0 +1,35 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_4.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_4
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       const v3, 1234.0
+       xor-long/2addr v1, v3
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d
new file mode 100644
index 0000000..a69d6ca
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_5.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_5
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long/2addr v1, v0
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d
new file mode 100644
index 0000000..2533783
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_xor_long_2addr_6.java
+.class public dot.junit.opcodes.xor_long_2addr.d.T_xor_long_2addr_6
+.super java/lang/Object
+
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run(JJ)J
+.limit regs 5
+
+       xor-long/2addr v1, v5
+       return-wide v1
+.end method
+
+
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/AllTests.java b/tools/vm-tests-tf/src/dot/junit/verify/AllTests.java
new file mode 100644
index 0000000..b4314f8
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/AllTests.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+/**
+ * Listing of all the tests that are to be run.
+ */
+public class AllTests {
+
+    public static void run() {
+        TestRunner.main(new String[] {AllTests.class.getName()});
+    }
+
+    public static final Test suite() {
+        TestSuite suite = new TestSuite("Tests for dalvik vm: test that "
+                + "structurally damaged files are rejected by the verifier");
+        suite.addTestSuite(dot.junit.verify.a1.Test_a1.class);
+        suite.addTestSuite(dot.junit.verify.a3.Test_a3.class);
+        suite.addTestSuite(dot.junit.verify.a5.Test_a5.class);
+        suite.addTestSuite(dot.junit.verify.b2.Test_b2.class);
+        suite.addTestSuite(dot.junit.verify.b3.Test_b3.class);
+        suite.addTestSuite(dot.junit.verify.b17.Test_b17.class);
+
+        return suite;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a1/Test_a1.java b/tools/vm-tests-tf/src/dot/junit/verify/a1/Test_a1.java
new file mode 100644
index 0000000..bf8f35e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a1/Test_a1.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008  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.
+ */
+
+package dot.junit.verify.a1;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_a1 extends DxTestCase {
+
+    /**
+     * @constraint A1
+     *
+     * @title empty insns array
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.a1.d.T_a1_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.d b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.d
new file mode 100644
index 0000000..fae89bb
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.d
@@ -0,0 +1,29 @@
+; Copyright (C) 2008 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.
+
+.source T_a1_1.java
+.class public dot.junit.verify.a1.d.T_a1_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 2
+    return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.dfh b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.dfh
new file mode 100644
index 0000000..2c11f5f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_1.dfh
@@ -0,0 +1,237 @@
+// Processing 'out/classes_dasm/dot/junit/verify/a1/d/T_a1_1.dex'...
+// Opened 'out/classes_dasm/dot/junit/verify/a1/d/T_a1_1.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : fa4f3449
+    49 34 4F FA 
+// parsed: offset 12, len 20: signature           : ea5e...e61c
+    EA 5E DC 6D AF F0 4E 0F CA BF 0E 8F FE 43 DE 4F 78 5B E6 1C 
+// parsed: offset 32, len 4: file_size           : 480
+    E0 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 356 (0x000164)
+    64 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 264
+    08 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 260 (0x000104) "<init>"
+    04 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 268 (0x00010c) "Ldot/junit/verify/a1/d/T_a1_1;"
+    0C 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 300 (0x00012c) "Ljava/lang/Object;"
+    2C 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 320 (0x000140) "T_a1_1.java"
+    40 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 333 (0x00014d) "V"
+    4D 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 336 (0x000150) "run"
+    50 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/verify/a1/d/T_a1_1;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/verify/a1/d/T_a1_1;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_b1_1.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 341 (0x000155)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 55 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.verify.a1.d.T_a1_1.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.verify.a1.d.T_a1_1.run"
+    // parsed: offset 240, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 1
+//@mod        01 00 00 00 
+        00 00 00 00 
+    // insns:
+        // parsed: offset 256, len 2: |0000: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 258, len 2: PADDING
+    00 00 
+// parsed: offset 260, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 268, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/verify/a1/d/T_a1_1;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 76 65 72 69 66 79 2F 61 31 2F 64 2F 54 5F 61 31 5F 31 3B 00 
+// parsed: offset 300, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 320, len 13: TYPE_STRING_DATA_ITEM [3] "T_a1_1.java"
+    0B 54 5F 61 31 5F 31 2E 6A 61 76 61 00 
+// parsed: offset 333, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 336, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/verify/a1/d/T_a1_1;"
+    // parsed: offset 341, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 342, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 343, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 344, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 345, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 346, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 349, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 351, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 352, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 353, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 355, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 356, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 360, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 372, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 384, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 396, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 408, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 420, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 432, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 444, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 260 (0x000104)
+        02 20 00 00 06 00 00 00 04 01 00 00 
+    // parsed: offset 456, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 341 (0x000155)
+        00 20 00 00 01 00 00 00 55 01 00 00 
+    // parsed: offset 468, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 356 (0x000164)
+        00 10 00 00 01 00 00 00 64 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_2.java b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_2.java
new file mode 100644
index 0000000..c7e6694
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a1/d/T_a1_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.a1.d;
+
+/**
+ *
+ */
+public class T_a1_2 {
+    // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a3/Test_a3.java b/tools/vm-tests-tf/src/dot/junit/verify/a3/Test_a3.java
new file mode 100644
index 0000000..94d5cb3
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a3/Test_a3.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.a3;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_a3 extends DxTestCase {
+
+    /**
+     * @constraint A3
+     * 
+     * @title The insns array must only contain valid Dalvik opcodes. 
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.a3.d.T_a3_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.d b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.d
new file mode 100644
index 0000000..0f8d599
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_a3_1.java
+.class public dot.junit.verify.a3.d.T_a3_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 2
+    nop
+    nop
+    nop
+    return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.dfh b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.dfh
new file mode 100644
index 0000000..0ca04de
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_1.dfh
@@ -0,0 +1,241 @@
+// Processing 'out/classes_dasm/dot/junit/verify/a3/d/T_a3_1.dex'...
+// Opened 'out/classes_dasm/dot/junit/verify/a3/d/T_a3_1.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : be8e34ae
+    AE 34 8E BE 
+// parsed: offset 12, len 20: signature           : 816e...af7b
+    81 6E 56 5F D0 A5 2E 3F EC 43 2E 24 E4 3D F9 E8 F6 F5 AF 7B 
+// parsed: offset 32, len 4: file_size           : 484
+    E4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 360 (0x000168)
+    68 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 268
+    0C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 264 (0x000108) "<init>"
+    08 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 272 (0x000110) "Ldot/junit/verify/a3/d/T_a3_1;"
+    10 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 304 (0x000130) "Ljava/lang/Object;"
+    30 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 324 (0x000144) "T_a3_1.java"
+    44 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 337 (0x000151) "V"
+    51 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 340 (0x000154) "run"
+    54 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/verify/a3/d/T_a3_1;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/verify/a3/d/T_a3_1;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_a3_1.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 345 (0x000159)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 59 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.verify.a3.d.T_a3_1.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.verify.a3.d.T_a3_1.run"
+    // parsed: offset 240, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 256, len 2: |0000: nop // spacer
+//@mod            00 00         
+            FF FF 
+        // parsed: offset 258, len 2: |0001: nop // spacer
+            00 00 
+        // parsed: offset 260, len 2: |0002: nop // spacer
+            00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 264, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 272, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/verify/a3/d/T_a3_1;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 76 65 72 69 66 79 2F 61 33 2F 64 2F 54 5F 61 33 5F 31 3B 00 
+// parsed: offset 304, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 324, len 13: TYPE_STRING_DATA_ITEM [3] "T_a3_1.java"
+    0B 54 5F 61 33 5F 31 2E 6A 61 76 61 00 
+// parsed: offset 337, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 340, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/verify/a3/d/T_a3_1;"
+    // parsed: offset 345, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 346, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 347, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 348, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 349, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 350, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 353, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 355, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 356, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 357, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 359, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 360, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 364, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 376, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 388, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 400, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 412, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 424, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 436, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 448, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 264 (0x000108)
+        02 20 00 00 06 00 00 00 08 01 00 00 
+    // parsed: offset 460, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 345 (0x000159)
+        00 20 00 00 01 00 00 00 59 01 00 00 
+    // parsed: offset 472, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 360 (0x000168)
+        00 10 00 00 01 00 00 00 68 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_2.java b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_2.java
new file mode 100644
index 0000000..9e5fbad
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a3/d/T_a3_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.a3.d;
+
+/**
+ *
+ */
+public class T_a3_2 {
+    // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a5/Test_a5.java b/tools/vm-tests-tf/src/dot/junit/verify/a5/Test_a5.java
new file mode 100644
index 0000000..e821028
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a5/Test_a5.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.a5;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_a5 extends DxTestCase {
+
+    /**
+     * @constraint A5
+     * 
+     * @title The last instruction in the insns array must end at index insns_size-1.  
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.a5.d.T_a5_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.d b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.d
new file mode 100644
index 0000000..898e900
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_a5_1.java
+.class public dot.junit.verify.a5.d.T_a5_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 2
+    nop
+    nop
+    nop
+    return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.dfh b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.dfh
new file mode 100644
index 0000000..a35f00e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_1.dfh
@@ -0,0 +1,241 @@
+// Processing 'out/classes_dasm/dot/junit/verify/a5/d/T_a5_1.dex'...
+// Opened 'out/classes_dasm/dot/junit/verify/a5/d/T_a5_1.dex', DEX version '035'
+// DEX file header:
+// parsed: offset 0, len 8: magic               : 'dex
+// 035'
+    64 65 78 0A 30 33 35 00 
+// parsed: offset 8, len 4: checksum            : 1acf344e
+    4E 34 CF 1A 
+// parsed: offset 12, len 20: signature           : 60c2...28af
+    60 C2 30 F0 A8 17 C1 F1 B9 47 0E D8 9D BD C6 0B E9 34 28 AF 
+// parsed: offset 32, len 4: file_size           : 484
+    E4 01 00 00 
+// parsed: offset 36, len 4: header_size         : 112
+    70 00 00 00 
+// parsed: offset 40, len 4: endian_tag          : 0x12345678
+    78 56 34 12 
+// parsed: offset 44, len 4: link_size           : 0
+    00 00 00 00 
+// parsed: offset 48, len 4: link_off            : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 52, len 4: map_off             : 360 (0x000168)
+    68 01 00 00 
+// parsed: offset 56, len 4: string_ids_size     : 6
+    06 00 00 00 
+// parsed: offset 60, len 4: string_ids_off      : 112 (0x000070)
+    70 00 00 00 
+// parsed: offset 64, len 4: type_ids_size       : 3
+    03 00 00 00 
+// parsed: offset 68, len 4: type_ids_off        : 136 (0x000088)
+    88 00 00 00 
+// parsed: offset 72, len 4: proto_ids_size      : 1
+    01 00 00 00 
+// parsed: offset 76, len 4: proto_ids_off       : 148 (0x000094)
+    94 00 00 00 
+// parsed: offset 80, len 4: field_ids_size      : 0
+    00 00 00 00 
+// parsed: offset 84, len 4: field_ids_off       : 0 (0x000000)
+    00 00 00 00 
+// parsed: offset 88, len 4: method_ids_size     : 3
+    03 00 00 00 
+// parsed: offset 92, len 4: method_ids_off      : 160 (0x0000a0)
+    A0 00 00 00 
+// parsed: offset 96, len 4: class_defs_size     : 1
+    01 00 00 00 
+// parsed: offset 100, len 4: class_defs_off      : 184 (0x0000b8)
+    B8 00 00 00 
+// parsed: offset 104, len 4: data_size           : 268
+    0C 01 00 00 
+// parsed: offset 108, len 4: data_off            : 216 (0x0000d8)
+    D8 00 00 00 
+// 
+// string_ids:
+// parsed: offset 112, len 4: [0] string_data_off: 264 (0x000108) "<init>"
+    08 01 00 00 
+// parsed: offset 116, len 4: [1] string_data_off: 272 (0x000110) "Ldot/junit/verify/a5/d/T_a5_1;"
+    10 01 00 00 
+// parsed: offset 120, len 4: [2] string_data_off: 304 (0x000130) "Ljava/lang/Object;"
+    30 01 00 00 
+// parsed: offset 124, len 4: [3] string_data_off: 324 (0x000144) "T_a5_1.java"
+    44 01 00 00 
+// parsed: offset 128, len 4: [4] string_data_off: 337 (0x000151) "V"
+    51 01 00 00 
+// parsed: offset 132, len 4: [5] string_data_off: 340 (0x000154) "run"
+    54 01 00 00 
+
+// type_ids:
+// parsed: offset 136, len 4: [0] descriptor_idx: 1 (0x000001) "Ldot/junit/verify/a5/d/T_a5_1;"
+    01 00 00 00 
+// parsed: offset 140, len 4: [1] descriptor_idx: 2 (0x000002) "Ljava/lang/Object;"
+    02 00 00 00 
+// parsed: offset 144, len 4: [2] descriptor_idx: 4 (0x000004) "V"
+    04 00 00 00 
+
+// proto_ids:
+// parsed: offset 148, len 12: [0] 
+//     shorty_idx: 4 (0x000004) "V"
+//     return_type_idx: 2 (0x000002) "V"
+//     parameters_off: 0 (0x000000)
+    04 00 00 00 02 00 00 00 00 00 00 00 
+
+// field_ids:
+
+// methods_ids:
+// parsed: offset 160, len 8: [0] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    00 00 00 00 00 00 00 00 
+// parsed: offset 168, len 8: [1] class_idx: 0 (0x000000)  proto_idx: 0 (0x000000) name_idx: 5 (0x000005) "run"
+    00 00 00 00 05 00 00 00 
+// parsed: offset 176, len 8: [2] class_idx: 1 (0x000001)  proto_idx: 0 (0x000000) name_idx: 0 (0x000000) "<init>"
+    01 00 00 00 00 00 00 00 
+
+// class_defs:
+// parsed: offset 184, len 32: Class [0]
+//     class_idx: 0 "Ldot/junit/verify/a5/d/T_a5_1;"
+//     access_flags: 0x000001 (PUBLIC)
+//     superclass_idx: 1 "Ljava/lang/Object;"
+//     interfaces_off: 0 (0x000000)
+//     source_file_idx: 3 "T_a5_1.java"
+//     annotations_off: 0 (0x000000)
+//     class_data_off: 345 (0x000159)
+//     static_values_off: 0 (0x000000)
+    00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 59 01 00 00 00 00 00 00 
+// data_section:
+// CODE_ITEM for "dot.junit.verify.a5.d.T_a5_1.<init>"
+    // parsed: offset 216, len 2: registers_size: 1
+        01 00 
+    // parsed: offset 218, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 220, len 2: outs_size: 1
+        01 00 
+    // parsed: offset 222, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 224, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 228, len 4: insns_size: 4
+        04 00 00 00 
+    // insns:
+        // parsed: offset 232, len 6: |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+            70 10 02 00 00 00 
+        // parsed: offset 238, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// CODE_ITEM for "dot.junit.verify.a5.d.T_a5_1.run"
+    // parsed: offset 240, len 2: registers_size: 2
+        02 00 
+    // parsed: offset 242, len 2: ins_size: 1
+        01 00 
+    // parsed: offset 244, len 2: outs_size: 0
+        00 00 
+    // parsed: offset 246, len 2: tries_size: 0
+        00 00 
+    // parsed: offset 248, len 4: debug_info_off: 0 (0x000000)
+        00 00 00 00 
+    // parsed: offset 252, len 4: insns_size: 4
+//@mod        04 00 00 00 
+        05 00 00 00 
+    // insns:
+        // parsed: offset 256, len 2: |0000: nop // spacer
+            00 00 
+        // parsed: offset 258, len 2: |0001: nop // spacer
+            00 00 
+        // parsed: offset 260, len 2: |0002: nop // spacer
+            00 00 
+        // parsed: offset 262, len 2: |0003: return-void
+            0E 00 
+    // tries: 
+    // handlers: 
+// parsed: offset 264, len 8: TYPE_STRING_DATA_ITEM [0] "<init>"
+    06 3C 69 6E 69 74 3E 00 
+// parsed: offset 272, len 32: TYPE_STRING_DATA_ITEM [1] "Ldot/junit/verify/a5/d/T_a5_1;"
+    1E 4C 64 6F 74 2F 6A 75 6E 69 74 2F 76 65 72 69 66 79 2F 61 35 2F 64 2F 54 5F 61 35 5F 31 3B 00 
+// parsed: offset 304, len 20: TYPE_STRING_DATA_ITEM [2] "Ljava/lang/Object;"
+    12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 3B 00 
+// parsed: offset 324, len 13: TYPE_STRING_DATA_ITEM [3] "T_a5_1.java"
+    0B 54 5F 61 35 5F 31 2E 6A 61 76 61 00 
+// parsed: offset 337, len 3: TYPE_STRING_DATA_ITEM [4] "V"
+    01 56 00 
+// parsed: offset 340, len 5: TYPE_STRING_DATA_ITEM [5] "run"
+    03 72 75 6E 00 
+// CLASS_DATA_ITEM for class [0] "Ldot/junit/verify/a5/d/T_a5_1;"
+    // parsed: offset 345, len 1: static_fields_size: 0
+        00 
+    // parsed: offset 346, len 1: instance_fields_size: 0
+        00 
+    // parsed: offset 347, len 1: direct_methods_size: 1
+        01 
+    // parsed: offset 348, len 1: virtual_methods_size: 1
+        01 
+    // static_fields:
+    // instance_fields:
+    // direct_methods:
+        // method [0]:
+            // parsed: offset 349, len 1: method_idx_diff: 0 (method_idx: 0 "<init>")
+                00 
+            // parsed: offset 350, len 3: access_flags: 0x010001 (PUBLIC CONSTRUCTOR)
+                81 80 04 
+            // parsed: offset 353, len 2: code_off: 216 (0x0000d8)
+                D8 01 
+    // virtual_methods:
+        // method [0]:
+            // parsed: offset 355, len 1: method_idx_diff: 1 (method_idx: 1 "run")
+                01 
+            // parsed: offset 356, len 1: access_flags: 0x000001 (PUBLIC)
+                01 
+            // parsed: offset 357, len 2: code_off: 240 (0x0000f0)
+                F0 01 
+// parsed: offset 359, len 1: PADDING
+    00 
+// map_list:
+    // parsed: offset 360, len 4: size: 10
+        0A 00 00 00 
+    // parsed: offset 364, len 12: [0] type: 0x0000 TYPE_HEADER_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 0 (0x000000)
+        00 00 00 00 01 00 00 00 00 00 00 00 
+    // parsed: offset 376, len 12: [1] type: 0x0001 TYPE_STRING_ID_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 112 (0x000070)
+        01 00 00 00 06 00 00 00 70 00 00 00 
+    // parsed: offset 388, len 12: [2] type: 0x0002 TYPE_TYPE_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 136 (0x000088)
+        02 00 00 00 03 00 00 00 88 00 00 00 
+    // parsed: offset 400, len 12: [3] type: 0x0003 TYPE_PROTO_ID_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 148 (0x000094)
+        03 00 00 00 01 00 00 00 94 00 00 00 
+    // parsed: offset 412, len 12: [4] type: 0x0005 TYPE_METHOD_ID_ITEM
+    //      unused: 0
+    //      size: 3
+    //      offset: 160 (0x0000a0)
+        05 00 00 00 03 00 00 00 A0 00 00 00 
+    // parsed: offset 424, len 12: [5] type: 0x0006 TYPE_CLASS_DEF_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 184 (0x0000b8)
+        06 00 00 00 01 00 00 00 B8 00 00 00 
+    // parsed: offset 436, len 12: [6] type: 0x2001 TYPE_CODE_ITEM
+    //      unused: 0
+    //      size: 2
+    //      offset: 216 (0x0000d8)
+        01 20 00 00 02 00 00 00 D8 00 00 00 
+    // parsed: offset 448, len 12: [7] type: 0x2002 TYPE_STRING_DATA_ITEM
+    //      unused: 0
+    //      size: 6
+    //      offset: 264 (0x000108)
+        02 20 00 00 06 00 00 00 08 01 00 00 
+    // parsed: offset 460, len 12: [8] type: 0x2000 TYPE_CLASS_DATA_ITEM
+    //      unused: 0
+    //      size: 1
+    //      offset: 345 (0x000159)
+        00 20 00 00 01 00 00 00 59 01 00 00 
+    // parsed: offset 472, len 12: [9] type: 0x1000 TYPE_MAP_LIST
+    //      unused: 0
+    //      size: 1
+    //      offset: 360 (0x000168)
+        00 10 00 00 01 00 00 00 68 01 00 00 
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_2.java b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_2.java
new file mode 100644
index 0000000..5f99d46
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/a5/d/T_a5_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.a5.d;
+
+/**
+ *
+ */
+public class T_a5_2 {
+    // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b17/Test_b17.java b/tools/vm-tests-tf/src/dot/junit/verify/b17/Test_b17.java
new file mode 100644
index 0000000..4c14f08
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b17/Test_b17.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b17;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_b17 extends DxTestCase {
+
+    /**
+     * Having throw, return and backward goto as a last opcode in the method is tested
+     * as part of corresponding opcodes tests.
+     */
+    
+    /**
+     * @constraint B17
+     * 
+     * @title attempt to leave insns array without return or throw.
+     * Since this constraint is trivial to be checked by the verifier,
+     * it is sufficient to have a trivial test.
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.b17.d.T_b17_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_1.d b/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_1.d
new file mode 100644
index 0000000..11715c2
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_1.d
@@ -0,0 +1,30 @@
+; Copyright (C) 2008 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.
+
+.source T_b17_1.java
+.class public dot.junit.verify.b17.d.T_b17_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 2
+
+       const/16 v0, 123 
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_2.java b/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_2.java
new file mode 100644
index 0000000..d1745e9
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b17/d/T_b17_2.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b17.d;
+
+/**
+ *
+ */
+public class T_b17_2 {
+    // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/Test_b2.java b/tools/vm-tests-tf/src/dot/junit/verify/b2/Test_b2.java
new file mode 100644
index 0000000..55ea386
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/Test_b2.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b2;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_b2 extends DxTestCase {
+
+    /**
+     * @constraint B2
+     * @title attempt to mess around with register-pairs.
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.b2.d.T_b2_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B2
+     * @title attempt to mess around with register-pairs.
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.verify.b2.d.T_b2_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B2
+     * @title attempt to mess around with register-pairs.
+     */
+    public void testVFE3() {
+        try {
+            Class.forName("dot.junit.verify.b2.d.T_b2_3");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B2
+     * @title attempt to mess around with register-pairs.
+     */
+    public void testVFE4() {
+        try {
+            Class.forName("dot.junit.verify.b2.d.T_b2_4");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B2
+     * @title attempt to mess around with register-pairs.
+     */
+    public void testVFE5() {
+        try {
+            Class.forName("dot.junit.verify.b2.d.T_b2_5");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.d b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.d
new file mode 100644
index 0000000..1fe908a
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_b2_1.java
+.class public dot.junit.verify.b2.d.T_b2_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 123
+       move v1, v0 ; illegal read access to v1
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.java b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.java
new file mode 100644
index 0000000..9ca108e
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_1.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b2.d;
+
+public class T_b2_1 {
+    public void run() {
+        long a = 123;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_2.d b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_2.d
new file mode 100644
index 0000000..a885c41
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_2.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_b2_2.java
+.class public dot.junit.verify.b2.d.T_b2_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const-wide v0, 123 
+       move v0, v1 ; // illegal read access to v0
+       return-void
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_3.d b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_3.d
new file mode 100644
index 0000000..bf8d6e0
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_3.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_b2_3.java
+.class public dot.junit.verify.b2.d.T_b2_3
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       const v0, 123 
+       const v1, 123 
+       move-wide v2, v0 ; // illegal read access to v0/1
+       return-void
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_4.d b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_4.d
new file mode 100644
index 0000000..bb158ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_4.d
@@ -0,0 +1,33 @@
+; Copyright (C) 2008 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.
+
+.source T_b2_4.java
+.class public dot.junit.verify.b2.d.T_b2_4
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 4
+
+       const-wide v0, 123
+       move v2, v0 ; // illegal read access to v0
+       return-void
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_5.d b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_5.d
new file mode 100644
index 0000000..483066d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b2/d/T_b2_5.d
@@ -0,0 +1,34 @@
+; Copyright (C) 2008 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.
+
+.source T_b2_5.java
+.class public dot.junit.verify.b2.d.T_b2_5
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 5
+
+       const-wide v0, 123
+       move-wide v2, v0
+       move-wide v2, v1 ; // illegal read access to v1/2
+       return-void
+.end method
+
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b3/Test_b3.java b/tools/vm-tests-tf/src/dot/junit/verify/b3/Test_b3.java
new file mode 100644
index 0000000..1aefb11
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b3/Test_b3.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b3;
+
+import dot.junit.DxTestCase;
+import dot.junit.DxUtil;
+
+public class Test_b3 extends DxTestCase {
+
+    /**
+     * @constraint B3
+     * @title register (or pair) has to be assigned first before it can be read. 
+     */
+    public void testVFE1() {
+        try {
+            Class.forName("dot.junit.verify.b3.d.T_b3_1");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+
+    /**
+     * @constraint B3
+     * @title register (or pair) has to be assigned first before it can be read. 
+     */
+    public void testVFE2() {
+        try {
+            Class.forName("dot.junit.verify.b3.d.T_b3_2");
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
+        }
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_0.java b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_0.java
new file mode 100644
index 0000000..0f0a5ce
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_0.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package dot.junit.verify.b3.d;
+
+/**
+*
+*/
+public class T_b3_0 {
+   // dummy
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_1.d b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_1.d
new file mode 100644
index 0000000..ffcd819
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_1.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_b3_1.java
+.class public dot.junit.verify.b3.d.T_b3_1
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 3
+
+       const v0, 123
+       move v2, v1
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_2.d b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_2.d
new file mode 100644
index 0000000..96feb07
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/verify/b3/d/T_b3_2.d
@@ -0,0 +1,32 @@
+; Copyright (C) 2008 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.
+
+.source T_b3_2.java
+.class public dot.junit.verify.b3.d.T_b3_2
+.super java/lang/Object
+
+.method public <init>()V
+.limit regs 1
+
+       invoke-direct {v0}, java/lang/Object/<init>()V
+       return-void
+.end method
+
+.method public run()V
+.limit regs 10
+
+       const-wide v0, 123
+       long-to-int v3, v1
+       return-void
+.end method
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
new file mode 100644
index 0000000..af7097f
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -0,0 +1,690 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package util.build;
+
+import com.android.dx.util.FileUtils;
+
+import dot.junit.AllTests;
+
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map.Entry;
+import java.util.regex.MatchResult;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Main class to generate data from the test suite to later run from a shell
+ * script. the project's home folder.<br>
+ * <project-home>/src must contain the java sources<br>
+ * <project-home>/src/<for-each-package>/Main_testN1.java will be generated<br>
+ * (one Main class for each test method in the Test_... class
+ */
+public class BuildDalvikSuite {
+
+    public static boolean DEBUG = true;
+
+    private static String JAVASRC_FOLDER = "";
+    private static String MAIN_SRC_OUTPUT_FOLDER = "";
+
+    // the folder for the generated junit-files for the cts host (which in turn
+    // execute the real vm tests using adb push/shell etc)
+    private static String HOSTJUNIT_SRC_OUTPUT_FOLDER = "";
+    private static String OUTPUT_FOLDER = "";
+    private static String COMPILED_CLASSES_FOLDER = "";
+
+    private static String CLASSES_OUTPUT_FOLDER = "";
+    private static String HOSTJUNIT_CLASSES_OUTPUT_FOLDER = "";
+
+    private static String CLASS_PATH = "";
+
+    private static String restrictTo = null; // e.g. restrict to "opcodes.add_double"
+
+    private static final String TARGET_JAR_ROOT_PATH = "/data/local/tmp/vm-tests";
+
+    private int testClassCnt = 0;
+    private int testMethodsCnt = 0;
+
+    /*
+     * using a linked hashmap to keep the insertion order for iterators.
+     * the junit suite/tests adding order is used to generate the order of the
+     * report.
+     * a map. key: fully qualified class name, value: a list of test methods for
+     * the given class
+     */
+    private LinkedHashMap<String, List<String>> map = new LinkedHashMap<String,
+    List<String>>();
+
+    private class MethodData {
+        String methodBody, constraint, title;
+    }
+
+    /**
+     * @param args
+     *            args 0 must be the project root folder (where src, lib etc.
+     *            resides)
+     * @throws IOException
+     */
+    public static void main(String[] args) throws IOException {
+
+        if (args.length > 5) {
+            JAVASRC_FOLDER = args[0];
+            OUTPUT_FOLDER = args[1];
+            CLASS_PATH = args[2];
+            MAIN_SRC_OUTPUT_FOLDER = args[3];
+            CLASSES_OUTPUT_FOLDER = MAIN_SRC_OUTPUT_FOLDER + "/classes";
+
+            COMPILED_CLASSES_FOLDER = args[4];
+
+            HOSTJUNIT_SRC_OUTPUT_FOLDER = args[5];
+            HOSTJUNIT_CLASSES_OUTPUT_FOLDER = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/classes";
+
+            if (args.length > 6) {
+                // optional: restrict to e.g. "opcodes.add_double"
+                restrictTo = args[6];
+                System.out.println("restricting build to: " + restrictTo);
+            }
+
+        } else {
+            System.out.println("usage: java-src-folder output-folder classpath " +
+                    "generated-main-files compiled_output generated-main-files " +
+            "[restrict-to-opcode]");
+            System.exit(-1);
+        }
+
+        long start = System.currentTimeMillis();
+        BuildDalvikSuite cat = new BuildDalvikSuite();
+        cat.compose();
+        long end = System.currentTimeMillis();
+
+        System.out.println("elapsed seconds: " + (end - start) / 1000);
+    }
+
+    public void compose() throws IOException {
+        System.out.println("Collecting all junit tests...");
+        new TestRunner() {
+            @Override
+            protected TestResult createTestResult() {
+                return new TestResult() {
+                    @Override
+                    protected void run(TestCase test) {
+                        addToTests(test);
+                    }
+
+                };
+            }
+        }.doRun(AllTests.suite());
+
+        // for each combination of TestClass and method, generate a Main_testN1
+        // class in the respective package.
+        // for the report make sure all N... tests are called first, then B,
+        // then E, then VFE test methods.
+        // e.g. dxc.junit.opcodes.aaload.Test_aaload - testN1() ->
+        // File Main_testN1.java in package dxc.junit.opcodes.aaload.
+        //
+        handleTests();
+    }
+
+    private void addToTests(TestCase test) {
+
+        String packageName = test.getClass().getPackage().getName();
+        packageName = packageName.substring(packageName.lastIndexOf('.'));
+
+
+        String method = test.getName(); // e.g. testVFE2
+        String fqcn = test.getClass().getName(); // e.g.
+        // dxc.junit.opcodes.iload_3.Test_iload_3
+
+        // ignore all tests not belonging to the given restriction
+        if (restrictTo != null && !fqcn.contains(restrictTo)) return;
+
+        testMethodsCnt++;
+        List<String> li = map.get(fqcn);
+        if (li == null) {
+            testClassCnt++;
+            li = new ArrayList<String>();
+            map.put(fqcn, li);
+        }
+        li.add(method);
+    }
+    private String curJunitFileName = null;
+    private String curJunitFileData = "";
+
+    private JavacBuildStep javacHostJunitBuildStep;
+
+    private void flushHostJunitFile() {
+        if (curJunitFileName != null) {
+            File toWrite = new File(curJunitFileName);
+            String absPath = toWrite.getAbsolutePath();
+            // add to java source files for later compilation
+            javacHostJunitBuildStep.addSourceFile(absPath);
+            // write file
+            curJunitFileData += "\n}\n";
+            writeToFileMkdir(toWrite, curJunitFileData);
+            curJunitFileName = null;
+            curJunitFileData = "";
+        }
+    }
+
+    private void openCTSHostFileFor(String pName, String classOnlyName) {
+        // flush previous JunitFile
+        flushHostJunitFile();
+        String sourceName = "JUnit_" + classOnlyName;
+
+        // prepare current testcase-file
+        curJunitFileName = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/" + pName.replaceAll("\\.","/") + "/" +
+        sourceName + ".java";
+        curJunitFileData = getWarningMessage() +
+        "package " + pName + ";\n" +
+        "import java.io.IOException;\n" +
+        "import com.android.tradefed.testtype.DeviceTestCase;\n" +
+        "\n" +
+        "public class " + sourceName + " extends DeviceTestCase {\n";
+    }
+
+    private String getShellExecJavaLine(String classpath, String mainclass) {
+      String cmd = String.format("dalvikvm -Xint:portable -Xmx512M -Xss32K -Djava.io.tmpdir=%s" +
+                                 " -classpath %s %s", TARGET_JAR_ROOT_PATH, classpath, mainclass);
+      return "String res = getDevice().executeShellCommand(\""+ cmd + "\");\n" +
+             "// A sucessful adb shell command returns an empty string.\n" +
+             "assertTrue(res.length() == 0);";
+    }
+
+    private String getWarningMessage() {
+        return "//Autogenerated code by " + this.getClass().getName() + "; do not edit.\n";
+    }
+
+    private void addCTSHostMethod(String pName, String method, MethodData md,
+            Set<String> dependentTestClassNames) {
+        curJunitFileData += "public void " + method + "() throws Exception {\n";
+        final String targetCoreJarPath = String.format("%s/dot/junit/dexcore.jar",
+                TARGET_JAR_ROOT_PATH);
+
+        // push class with Main jar.
+        String mjar = "Main_" + method + ".jar";
+        String pPath = pName.replaceAll("\\.","/");
+        String mainJar = String.format("%s/%s/%s", TARGET_JAR_ROOT_PATH, pPath, mjar);
+
+        String cp = String.format("%s:%s", targetCoreJarPath, mainJar);
+        for (String depFqcn : dependentTestClassNames) {
+            int lastDotPos = depFqcn.lastIndexOf('.');
+            String sourceName = depFqcn.replaceAll("\\.", "/") + ".jar";
+            String targetName= String.format("%s/%s", TARGET_JAR_ROOT_PATH,
+                    sourceName);
+            cp += ":" + targetName;
+            // dot.junit.opcodes.invoke_interface_range.ITest
+            // -> dot/junit/opcodes/invoke_interface_range/ITest.jar
+        }
+
+        //"dot.junit.opcodes.add_double_2addr.Main_testN2";
+        String mainclass = pName + ".Main_" + method;
+        curJunitFileData += "    " + getShellExecJavaLine(cp, mainclass);
+        curJunitFileData += "}\n\n";
+    }
+
+    private void handleTests() throws IOException {
+        System.out.println("collected " + testMethodsCnt + " test methods in " +
+                testClassCnt + " junit test classes");
+        Set<BuildStep> targets = new TreeSet<BuildStep>();
+
+        javacHostJunitBuildStep = new JavacBuildStep(HOSTJUNIT_CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+
+
+        JavacBuildStep javacBuildStep = new JavacBuildStep(
+                CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+
+        for (Entry<String, List<String>> entry : map.entrySet()) {
+
+            String fqcn = entry.getKey();
+            int lastDotPos = fqcn.lastIndexOf('.');
+            String pName = fqcn.substring(0, lastDotPos);
+            String classOnlyName = fqcn.substring(lastDotPos + 1);
+            String instPrefix = "new " + classOnlyName + "()";
+
+            openCTSHostFileFor(pName, classOnlyName);
+
+            List<String> methods = entry.getValue();
+            Collections.sort(methods, new Comparator<String>() {
+                public int compare(String s1, String s2) {
+                    // TODO sort according: test ... N, B, E, VFE
+                    return s1.compareTo(s2);
+                }
+            });
+            for (String method : methods) {
+                // e.g. testN1
+                if (!method.startsWith("test")) {
+                    throw new RuntimeException("no test method: " + method);
+                }
+
+                // generate the Main_xx java class
+
+                // a Main_testXXX.java contains:
+                // package <packagenamehere>;
+                // public class Main_testxxx {
+                // public static void main(String[] args) {
+                // new dxc.junit.opcodes.aaload.Test_aaload().testN1();
+                // }
+                // }
+                MethodData md = parseTestMethod(pName, classOnlyName, method);
+                String methodContent = md.methodBody;
+
+                Set<String> dependentTestClassNames = parseTestClassName(pName,
+                        classOnlyName, methodContent);
+
+                addCTSHostMethod(pName, method, md, dependentTestClassNames);
+
+
+                if (dependentTestClassNames.isEmpty()) {
+                    continue;
+                }
+
+
+                String content = getWarningMessage() +
+                "package " + pName + ";\n" +
+                "import " + pName + ".d.*;\n" +
+                "import dot.junit.*;\n" +
+                "public class Main_" + method + " extends DxAbstractMain {\n" +
+                "    public static void main(String[] args) throws Exception {" +
+                methodContent + "\n}\n";
+
+                String fileName = getFileName(pName, method, ".java");
+                File sourceFile = getFileFromPackage(pName, method);
+
+                File classFile = new File(CLASSES_OUTPUT_FOLDER + "/" +
+                        getFileName(pName, method, ".class"));
+                // if (sourceFile.lastModified() > classFile.lastModified()) {
+                writeToFile(sourceFile, content);
+                javacBuildStep.addSourceFile(sourceFile.getAbsolutePath());
+
+                BuildStep dexBuildStep = generateDexBuildStep(
+                        CLASSES_OUTPUT_FOLDER, getFileName(pName, method, ""));
+                targets.add(dexBuildStep);
+                // }
+
+                generateBuildStepFor(pName, method, dependentTestClassNames,
+                        targets);
+            }
+
+
+        }
+
+        // write latest HOSTJUNIT generated file.
+        flushHostJunitFile();
+
+        if (!javacHostJunitBuildStep.build()) {
+            System.out.println("main javac cts-host-hostjunit-classes build step failed");
+            System.exit(1);
+        }
+
+        if (javacBuildStep.build()) {
+            for (BuildStep buildStep : targets) {
+                if (!buildStep.build()) {
+                    System.out.println("building failed. buildStep: " +
+                            buildStep.getClass().getName() + ", " + buildStep);
+                    System.exit(1);
+                }
+            }
+        } else {
+            System.out.println("main javac dalvik-cts-buildutil build step failed");
+            System.exit(1);
+        }
+    }
+
+    private void generateBuildStepFor(String pName, String method,
+            Set<String> dependentTestClassNames, Set<BuildStep> targets) {
+
+
+        for (String dependentTestClassName : dependentTestClassNames) {
+            generateBuildStepForDependant(dependentTestClassName, targets);
+        }
+    }
+
+    private void generateBuildStepForDependant(String dependentTestClassName,
+            Set<BuildStep> targets) {
+
+        File sourceFolder = new File(JAVASRC_FOLDER);
+        String fileName = dependentTestClassName.replace('.', '/').trim();
+
+        if (new File(sourceFolder, fileName + ".dfh").exists()) {
+
+            BuildStep.BuildFile inputFile = new BuildStep.BuildFile(
+                    JAVASRC_FOLDER, fileName + ".dfh");
+            BuildStep.BuildFile dexFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER, fileName + ".dex");
+
+            DFHBuildStep buildStep = new DFHBuildStep(inputFile, dexFile);
+
+            BuildStep.BuildFile jarFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER, fileName + ".jar");
+            JarBuildStep jarBuildStep = new JarBuildStep(dexFile,
+                    "classes.dex", jarFile, true);
+            jarBuildStep.addChild(buildStep);
+
+            targets.add(jarBuildStep);
+            return;
+        }
+
+        if (new File(sourceFolder, fileName + ".d").exists()) {
+
+            BuildStep.BuildFile inputFile = new BuildStep.BuildFile(
+                    JAVASRC_FOLDER, fileName + ".d");
+            BuildStep.BuildFile dexFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER, fileName + ".dex");
+
+            DasmBuildStep buildStep = new DasmBuildStep(inputFile, dexFile);
+
+            BuildStep.BuildFile jarFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER, fileName + ".jar");
+
+            JarBuildStep jarBuildStep = new JarBuildStep(dexFile,
+                    "classes.dex", jarFile, true);
+            jarBuildStep.addChild(buildStep);
+            targets.add(jarBuildStep);
+            return;
+        }
+
+        if (new File(sourceFolder, fileName + ".java").exists()) {
+
+            BuildStep dexBuildStep = generateDexBuildStep(
+                    COMPILED_CLASSES_FOLDER, fileName);
+            targets.add(dexBuildStep);
+            return;
+        }
+
+        try {
+            if (Class.forName(dependentTestClassName) != null) {
+
+                BuildStep dexBuildStep = generateDexBuildStep(
+                        COMPILED_CLASSES_FOLDER, fileName);
+                targets.add(dexBuildStep);
+                return;
+            }
+        } catch (ClassNotFoundException e) {
+            // do nothing
+        }
+
+        throw new RuntimeException("neither .dfh,.d,.java file of dependant test class found : " +
+                dependentTestClassName + ";" + fileName);
+    }
+
+    private BuildStep generateDexBuildStep(String classFileFolder,
+            String classFileName) {
+        BuildStep.BuildFile classFile = new BuildStep.BuildFile(
+                classFileFolder, classFileName + ".class");
+
+        BuildStep.BuildFile tmpJarFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
+                classFileName + "_tmp.jar");
+
+        JarBuildStep jarBuildStep = new JarBuildStep(classFile, classFileName +
+                ".class", tmpJarFile, false);
+
+        BuildStep.BuildFile outputFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
+                classFileName + ".jar");
+
+        DexBuildStep dexBuildStep = new DexBuildStep(tmpJarFile, outputFile,
+                true);
+
+        dexBuildStep.addChild(jarBuildStep);
+        return dexBuildStep;
+
+    }
+
+    /**
+     * @param pName
+     * @param classOnlyName
+     * @param methodSource
+     * @return testclass names
+     */
+    private Set<String> parseTestClassName(String pName, String classOnlyName,
+            String methodSource) {
+        Set<String> entries = new HashSet<String>();
+        String opcodeName = classOnlyName.substring(5);
+
+        Scanner scanner = new Scanner(methodSource);
+
+        String[] patterns = new String[] {"new\\s(T_" + opcodeName + "\\w*)",
+                "(T_" + opcodeName + "\\w*)", "new\\s(T\\w*)"};
+
+        String token = null;
+        for (String pattern : patterns) {
+            token = scanner.findWithinHorizon(pattern, methodSource.length());
+            if (token != null) {
+                break;
+            }
+        }
+
+        if (token == null) {
+            System.err.println("warning: failed to find dependent test class name: " + pName +
+                    ", " + classOnlyName + " in methodSource:\n" + methodSource);
+            return entries;
+        }
+
+        MatchResult result = scanner.match();
+
+        entries.add((pName + ".d." + result.group(1)).trim());
+
+        // search additional @uses directives
+        Pattern p = Pattern.compile("@uses\\s+(.*)\\s+", Pattern.MULTILINE);
+        Matcher m = p.matcher(methodSource);
+        while (m.find()) {
+            String res = m.group(1);
+            entries.add(res.trim());
+        }
+
+        // lines with the form @uses
+        // dot.junit.opcodes.add_double.jm.T_add_double_2
+        // one dependency per one @uses
+        // TODO
+
+        return entries;
+    }
+
+    private MethodData parseTestMethod(String pname, String classOnlyName,
+            String method) {
+
+        String path = pname.replaceAll("\\.", "/");
+        String absPath = JAVASRC_FOLDER + "/" + path + "/" + classOnlyName + ".java";
+        File f = new File(absPath);
+
+        Scanner scanner;
+        try {
+            scanner = new Scanner(f);
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException("error while reading to file: " + e.getClass().getName() +
+                    ", msg:" + e.getMessage());
+        }
+
+        String methodPattern = "public\\s+void\\s+" + method + "[^\\{]+\\{";
+
+        String token = scanner.findWithinHorizon(methodPattern, (int) f.length());
+        if (token == null) {
+            throw new RuntimeException("cannot find method source of 'public void " + method +
+                    "' in file '" + absPath + "'");
+        }
+
+        MatchResult result = scanner.match();
+        result.start();
+        result.end();
+
+        StringBuilder builder = new StringBuilder();
+        //builder.append(token);
+
+        try {
+            FileReader reader = new FileReader(f);
+            reader.skip(result.end());
+
+            char currentChar;
+            int blocks = 1;
+            while ((currentChar = (char) reader.read()) != -1 && blocks > 0) {
+                switch (currentChar) {
+                    case '}': {
+                        blocks--;
+                        builder.append(currentChar);
+                        break;
+                    }
+                    case '{': {
+                        blocks++;
+                        builder.append(currentChar);
+                        break;
+                    }
+                    default: {
+                        builder.append(currentChar);
+                        break;
+                    }
+                }
+            }
+            if (reader != null) {
+                reader.close();
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("failed to parse", e);
+        }
+
+        // find the @title/@constraint in javadoc comment for this method
+        Scanner scanner2;
+        try {
+            // using platform's default charset
+            scanner2 = new Scanner(f);
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException("error while reading to file: " + e.getClass().getName() +
+                    ", msg:" + e.getMessage());
+        }
+        // using platform's default charset
+        String all = new String(FileUtils.readFile(f));
+        // System.out.println("grepping javadoc found for method " + method +
+        // " in " + pname + "," + classOnlyName);
+        String commentPattern = "/\\*\\*([^{]*)\\*/\\s*" + methodPattern;
+        Pattern p = Pattern.compile(commentPattern, Pattern.DOTALL);
+        Matcher m = p.matcher(all);
+        String title = null, constraint = null;
+        if (m.find()) {
+            String res = m.group(1);
+            // System.out.println("res: " + res);
+            // now grep @title and @constraint
+            Matcher titleM = Pattern.compile("@title (.*)", Pattern.DOTALL)
+            .matcher(res);
+            if (titleM.find()) {
+                title = titleM.group(1).replaceAll("\\n     \\*", "");
+                title = title.replaceAll("\\n", " ");
+                title = title.trim();
+                // System.out.println("title: " + title);
+            } else {
+                System.err.println("warning: no @title found for method " + method + " in " + pname +
+                        "," + classOnlyName);
+            }
+            // constraint can be one line only
+            Matcher constraintM = Pattern.compile("@constraint (.*)").matcher(
+                    res);
+            if (constraintM.find()) {
+                constraint = constraintM.group(1);
+                constraint = constraint.trim();
+                // System.out.println("constraint: " + constraint);
+            } else if (method.contains("VFE")) {
+                System.err
+                .println("warning: no @constraint for for a VFE method:" + method + " in " +
+                        pname + "," + classOnlyName);
+            }
+        } else {
+            System.err.println("warning: no javadoc found for method " + method + " in " + pname +
+                    "," + classOnlyName);
+        }
+        MethodData md = new MethodData();
+        md.methodBody = builder.toString();
+        md.constraint = constraint;
+        md.title = title;
+        if (scanner != null) {
+            scanner.close();
+        }
+        if (scanner2 != null) {
+            scanner.close();
+        }
+        return md;
+    }
+
+    private void writeToFileMkdir(File file, String content) {
+        File parent = file.getParentFile();
+        if (!parent.exists() && !parent.mkdirs()) {
+            throw new RuntimeException("failed to create directory: " + parent.getAbsolutePath());
+        }
+        writeToFile(file, content);
+    }
+
+    private void writeToFile(File file, String content) {
+        try {
+            if (file.length() == content.length()) {
+                FileReader reader = new FileReader(file);
+                char[] charContents = new char[(int) file.length()];
+                reader.read(charContents);
+                String contents = new String(charContents);
+                if (contents.equals(content)) {
+                    // System.out.println("skipping identical: "
+                    // + file.getAbsolutePath());
+                    return;
+                }
+            }
+
+            //System.out.println("writing file " + file.getAbsolutePath());
+
+            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
+                    new FileOutputStream(file), "utf-8"));
+            bw.write(content);
+            bw.close();
+        } catch (Exception e) {
+            throw new RuntimeException("error while writing to file: " + e.getClass().getName() +
+                    ", msg:" + e.getMessage());
+        }
+    }
+
+    private File getFileFromPackage(String pname, String methodName)
+    throws IOException {
+        // e.g. dxc.junit.argsreturns.pargsreturn
+        String path = getFileName(pname, methodName, ".java");
+        String absPath = MAIN_SRC_OUTPUT_FOLDER + "/" + path;
+        File dirPath = new File(absPath);
+        File parent = dirPath.getParentFile();
+        if (!parent.exists() && !parent.mkdirs()) {
+            throw new IOException("failed to create directory: " + absPath);
+        }
+        return dirPath;
+    }
+
+    private String getFileName(String pname, String methodName,
+            String extension) {
+        String path = pname.replaceAll("\\.", "/");
+        return new File(path, "Main_" + methodName + extension).getPath();
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/BuildStep.java b/tools/vm-tests-tf/src/util/build/BuildStep.java
new file mode 100644
index 0000000..dbc6bca
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/BuildStep.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.util.HashSet;
+import java.util.Set;
+
+abstract class BuildStep implements Comparable<BuildStep> {
+
+    BuildFile inputFile;
+    BuildFile outputFile;
+
+    static class BuildFile {
+        final File folder;
+        final File fileName;
+
+        BuildFile(String folder, String fileName) {
+            this.folder = new File(folder);
+            this.fileName = new File(this.folder, fileName);
+        }
+
+        String getPath() {
+            return fileName.getAbsolutePath();
+        }
+
+        @Override
+        public int hashCode() {
+            return fileName.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == null) return false;
+            if (this == obj) return true;
+            if (getClass() == obj.getClass()) {
+                BuildFile other = (BuildFile) obj;
+                return fileName.equals(other.fileName);
+            }
+            return false;
+        }
+    }
+
+    BuildStep(BuildFile inputFile, BuildFile outputFile) {
+        if (inputFile == null) {
+            throw new NullPointerException("inputFile is null");
+        }
+        if (outputFile == null) {
+            throw new NullPointerException("outputFile is null");
+        }
+        this.inputFile = inputFile;
+        this.outputFile = outputFile;
+    }
+
+    BuildStep() {
+    }
+
+    private Set<BuildStep> children;
+
+    boolean build() {
+        if (children != null) {
+            for (BuildStep child : children) {
+                if (!child.build()) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) return false;
+        if (obj == this) return true;
+        return this.getClass() == obj.getClass();
+    }
+
+    @Override
+    public abstract int hashCode();
+
+    public void addChild(BuildStep child) {
+        if (children == null) {
+            children = new HashSet<BuildStep>();
+        }
+        children.add(child);
+    }
+
+    public static void copyFile(File in, File out) throws IOException {
+        FileChannel inChannel = new FileInputStream(in).getChannel();
+        FileChannel outChannel = new FileOutputStream(out).getChannel();
+        try {
+            inChannel.transferTo(0, inChannel.size(), outChannel);
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            if (inChannel != null) inChannel.close();
+            if (outChannel != null) outChannel.close();
+        }
+    }
+
+    public int compareTo(BuildStep o) {
+        return (inputFile == o.inputFile ? 0 : (inputFile != null
+                ? (o.inputFile != null ? inputFile.getPath().compareTo(
+                        o.inputFile.getPath()) : 1) : -1));
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/DFHBuildStep.java b/tools/vm-tests-tf/src/util/build/DFHBuildStep.java
new file mode 100644
index 0000000..47a81bf
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/DFHBuildStep.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import dxconvext.ClassFileAssembler;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.OutputStream;
+import java.io.Reader;
+
+public class DFHBuildStep extends BuildStep {
+
+    public DFHBuildStep(BuildFile inputFile, BuildFile outputFile) {
+        super(inputFile, outputFile);
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+            File out_dir = outputFile.fileName.getParentFile();
+            if (!out_dir.exists() && !out_dir.mkdirs()) {
+                System.err.println("failed to create dir: "
+                        + out_dir.getAbsolutePath());
+                return false;
+            }
+
+            ClassFileAssembler cfAssembler = new ClassFileAssembler();
+            Reader r;
+            OutputStream os;
+            try {
+                r = new FileReader(inputFile.fileName);
+                os = new FileOutputStream(outputFile.fileName);
+            } catch (FileNotFoundException e) {
+                System.err.println(e);
+                return false;
+            }
+            try {
+                // cfAssembler throws a runtime exception
+                cfAssembler.writeClassFile(r, os, true);
+            } catch (RuntimeException e) {
+                System.err.println("error in DFHBuildStep for inputfile "+inputFile.fileName+", outputfile "+outputFile.fileName);
+                throw e;
+            }
+            
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if (super.equals(obj)) {
+            return inputFile.equals(((DFHBuildStep) obj).inputFile)
+                    && outputFile.equals(((DFHBuildStep) obj).outputFile);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return (inputFile == null ? 31 : inputFile.hashCode())
+                ^ (outputFile == null ? 37 : outputFile.hashCode());
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/DasmBuildStep.java b/tools/vm-tests-tf/src/util/build/DasmBuildStep.java
new file mode 100644
index 0000000..b77a491
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/DasmBuildStep.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import dasm.DAsm;
+import dasm.DasmError;
+import dasm.Utils;
+
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+class DasmBuildStep extends BuildStep {
+
+
+    boolean generate_linenum = false;
+
+    DasmBuildStep(BuildFile inputFile, BuildFile outputFile) {
+        super(inputFile, outputFile);
+
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+            return assemble(inputFile.fileName);
+        }
+        return false;
+    }
+
+    private static Reader createReader(String fname) throws IOException {
+        FileInputStream fs = new FileInputStream(fname);
+        InputStreamReader ir;
+        ir = new InputStreamReader(fs);
+        return new BufferedReader(ir);
+    }
+    
+    private boolean assemble(File file) {
+        DAsm dAsm = new DAsm();
+        String fname = file.getAbsolutePath();
+        
+        // read and parse .d file
+        Reader inp = null; 
+        try {
+            inp = createReader(fname);
+            dAsm.readD(inp, new File(fname).getName(), generate_linenum);
+            close(inp);
+        } catch(DasmError e) {
+            if(BuildDalvikSuite.DEBUG)
+                e.printStackTrace();
+            System.err.println("DASM Error: " + e.getMessage());
+        } catch(Exception e) {
+             if(BuildDalvikSuite.DEBUG)
+                 e.printStackTrace();
+             System.err.println("Exception <" + e.getClass().getName() + ">" + e.getMessage() + 
+                         " while reading and parsing " + fname);
+             return false;
+             
+        }
+        finally {
+            close(inp);
+        }
+        
+        if(dAsm.errorCount() > 0) {
+            System.err.println("Found " + dAsm.errorCount() + " errors " +
+                    " while reading and parsing " + fname);
+                return false;
+        }
+
+        String class_path[] = Utils.getClassFieldFromString(dAsm.getClassName());
+        String class_name = class_path[1];
+
+        // determine where to place .dex file
+        String dest_dir = outputFile.folder.getAbsolutePath();
+        if (class_path[0] != null) {
+            String class_dir = class_path[0].replaceAll("/|\\.", Character.toString(File.separatorChar));                                           
+            if (dest_dir != null) {
+                dest_dir = dest_dir + File.separator + class_dir;
+            } else {
+                dest_dir = class_dir;
+            }
+        }
+            
+        File out_file = null;
+        
+        if (dest_dir == null) {
+            out_file = new File(class_name + ".dex");
+        } else {
+            out_file = new File(dest_dir, class_name + ".dex");
+
+            // check that dest_dir exists
+            File dest = new File(dest_dir);
+            if (!dest.exists()) {
+                dest.mkdirs();
+            }
+
+            if (!dest.isDirectory()) {
+                System.err.println("Cannot create directory " + dest_dir);
+                return false;
+            }
+        }
+         
+        // write output
+        FileOutputStream outp = null;
+
+        try {
+            outp = new FileOutputStream(out_file);
+            dAsm.write(outp, null);
+        } catch(Exception e) {
+                if(BuildDalvikSuite.DEBUG)
+                e.printStackTrace();
+                System.err.println("Exception <" + e.getClass().getName() + ">" + e.getMessage() + 
+                        " while writing " + out_file.getPath());
+
+                close(outp);
+
+                out_file.delete();
+
+                return false;
+       }
+       finally {
+           close(outp);
+       }
+
+       return true;
+    }
+    
+    private static void close(Closeable c) {
+        if(c == null)
+            return;
+        try {
+            c.close();
+        } catch(IOException e) {
+            
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            DasmBuildStep other = (DasmBuildStep) obj;
+
+            return inputFile.equals(other.inputFile)
+                    && generate_linenum == other.generate_linenum
+                    && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode()
+                ^ (generate_linenum ? 31 : 37);
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/DexBuildStep.java b/tools/vm-tests-tf/src/util/build/DexBuildStep.java
new file mode 100644
index 0000000..6aba51c
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/DexBuildStep.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import com.android.dx.command.dexer.Main;
+import java.io.IOException;
+
+public class DexBuildStep extends BuildStep {
+
+    private final boolean deleteInputFileAfterBuild;
+
+    DexBuildStep(BuildFile inputFile, BuildFile outputFile,
+            boolean deleteInputFileAfterBuild) {
+        super(inputFile, outputFile);
+        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
+    }
+
+    @Override
+    boolean build() {
+
+        if (super.build()) {
+            Main.Arguments args = new Main.Arguments();
+
+            args.jarOutput = true;
+            args.fileNames = new String[] {inputFile.fileName.getAbsolutePath()};
+
+            args.outName = outputFile.fileName.getAbsolutePath();
+
+            int result = 0;
+            try {
+                result = Main.run(args);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+
+            if (result == 0) {
+                if (deleteInputFileAfterBuild) {
+                    inputFile.fileName.delete();
+                }
+                return true;
+            } else {
+                System.err.println("exception while dexing "
+                        + inputFile.fileName.getAbsolutePath() + " to "
+                        + args.outName);
+                return false;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            DexBuildStep other = (DexBuildStep) obj;
+
+            return inputFile.equals(other.inputFile)
+                    && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/util/build/JarBuildStep.java b/tools/vm-tests-tf/src/util/build/JarBuildStep.java
new file mode 100644
index 0000000..776e905
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JarBuildStep.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import sun.tools.jar.Main;
+
+import java.io.File;
+import java.io.IOException;
+
+
+public class JarBuildStep extends BuildStep {
+
+    String destFileName;
+    private final boolean deleteInputFileAfterBuild;
+
+    public JarBuildStep(BuildFile inputFile, String destFileName,
+            BuildFile outputFile, boolean deleteInputFileAfterBuild) {
+        super(inputFile, outputFile);
+        this.destFileName = destFileName;
+        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+            File tempFile = new File(inputFile.folder, destFileName);
+            try {
+                if (!inputFile.fileName.equals(tempFile)) {
+                    copyFile(inputFile.fileName, tempFile);
+                } else {
+                    tempFile = null;
+                }
+            } catch (IOException e) {
+                System.err.println("io exception:"+e.getMessage());
+                e.printStackTrace();
+                return false;
+            }
+
+            File outDir = outputFile.fileName.getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+            String[] arguments = new String[] {
+                    "-cMf", outputFile.fileName.getAbsolutePath(), "-C",
+                    inputFile.folder.getAbsolutePath(), destFileName};
+            Main main = new Main(System.out, System.err, "jar");
+            boolean success = main.run(arguments);
+
+            if (success) {
+                if (tempFile != null) {
+                    tempFile.delete();
+                }
+                if (deleteInputFileAfterBuild) {
+                    inputFile.fileName.delete();
+                }
+            } else {
+                System.err.println("exception in JarBuildStep while calling jar with args:" +
+                        " \"-cMf\", "+outputFile.fileName.getAbsolutePath()+", \"-C\"," + 
+                        inputFile.folder.getAbsolutePath()+", "+ destFileName);
+            }
+            return success;
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode()
+                ^ destFileName.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JarBuildStep other = (JarBuildStep) obj;
+            return inputFile.equals(other.inputFile)
+                    && outputFile.equals(other.outputFile)
+                    && destFileName.equals(other.destFileName);
+
+        }
+        return false;
+    }
+
+}
diff --git a/tools/vm-tests-tf/src/util/build/JavacBuildStep.java b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
new file mode 100644
index 0000000..7d7033f
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package util.build;
+
+import com.sun.tools.javac.Main;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Set;
+
+public class JavacBuildStep extends BuildStep {
+
+    private final String destPath;
+    private final String classPath;
+    private final Set<String> sourceFiles = new HashSet<String>();
+    public JavacBuildStep(String destPath, String classPath) {
+        this.destPath = destPath;
+        this.classPath = classPath;
+    }
+    
+    public void addSourceFile(String sourceFile)
+    {
+        sourceFiles.add(sourceFile);
+    }
+    
+    @Override
+    boolean build() {
+        if (super.build())
+        {
+            if (sourceFiles.isEmpty())
+            {
+                return true;
+            }
+            
+            File destFile = new File(destPath);
+            if (!destFile.exists() && !destFile.mkdirs())
+            {
+                System.err.println("failed to create destination dir");
+                return false;
+            }
+            int args = 4;
+            String[] commandLine = new String[sourceFiles.size()+args];
+            commandLine[0] = "-classpath";
+            commandLine[1] = classPath;
+            commandLine[2] = "-d";
+            commandLine[3] = destPath;
+             
+            String[] files = new String[sourceFiles.size()];
+            sourceFiles.toArray(files);
+            
+            System.arraycopy(files, 0, commandLine, args, files.length);
+            
+            
+            return Main.compile(commandLine, new PrintWriter(System.err)) == 0;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        // TODO Auto-generated method stub
+        if (super.equals(obj))
+        {
+            JavacBuildStep other = (JavacBuildStep) obj;
+            return destPath.equals(other.destPath) 
+                && classPath.equals(other.classPath)
+                && sourceFiles.equals(other.sourceFiles);
+        }
+        return false;
+    }
+    
+    @Override
+    public int hashCode() {
+        return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
+    }
+}
diff --git a/tools/vm-tests/src/util/build/DexBuildStep.java b/tools/vm-tests/src/util/build/DexBuildStep.java
index cc65af9..6aba51c 100644
--- a/tools/vm-tests/src/util/build/DexBuildStep.java
+++ b/tools/vm-tests/src/util/build/DexBuildStep.java
@@ -17,6 +17,7 @@
 package util.build;
 
 import com.android.dx.command.dexer.Main;
+import java.io.IOException;
 
 public class DexBuildStep extends BuildStep {
 
@@ -39,7 +40,13 @@
 
             args.outName = outputFile.fileName.getAbsolutePath();
 
-            int result = Main.run(args);
+            int result = 0;
+            try {
+                result = Main.run(args);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
 
             if (result == 0) {
                 if (deleteInputFileAfterBuild) {
